Почему в С# это не разрешено в инициализаторе члена, но в VB.Net Me разрешено
Я конвертирую приложение VB.Net в С# и заметил, что в коде VB.Net есть переменная частного члена, которая инициализируется с помощью Me
следующим образом:
Private m_ClassA As New MyCollection(Of ClassA)(Me)
Когда я конвертирую это в код С# следующим образом:
private MyCollection<ClassA> _classA = new MyCollection<ClassA>(this);
У меня есть ошибка
Аргумент value
, тогда как тип параметра ref
.
Если я положил ref
перед параметром this
, я получаю ошибку
не может использовать this
в инициализаторе члена.
Я читал здесь, что члены инициализируются перед базовым классом, поэтому this
не может использоваться в членах, поскольку он еще не может быть инициализирован. Мой вопрос в том, почему это законно в VB.Net, а не С#?
Разве это не так, как компилятор обрабатывает его по-другому? Кажется странным, что у двух есть разные формы поведения.
Чтобы обойти это, я предполагаю, что инициализирую член в конструкторе.
Ответы
Ответ 1
Согласно MSDN
.
Этот доступ разрешен только в блоке экземпляра конструктор, метод экземпляра или средство доступа к экземпляру.
Это можно прочитать здесь.
Вы не можете получить доступ к этому в любом месте, кроме экземпляра/конструктора. Таким образом, вы не могли бы сделать что-то подобное:
public class Foo
{
private Foo _foo = this;
}
Как вы говорите, в C#
вам понадобится использовать методы/конструкторы.
public class Foo
{
private Foo _foo;
public Foo()
{
_foo = this;
}
public void InitializeFoo()
{
_foo = this;
}
}
MSDN
также указывает следующее для Me
:
Ключевое слово Me предоставляет способ ссылаться на конкретный экземпляр класс или структуру, в которой код в настоящее время выполняется. меня ведет себя как переменная объекта или структурная переменная ссылаясь на текущий экземпляр.
Похоже, что после выполнения класса вы получаете доступ к this
, но только внутри методов экземпляра, тогда как в VB.NET
вы получаете доступ в момент выполнения класса, поэтому причина, по которой вы не можете использовать это, как вы заявили.
Ответ 2
VB существовал до .NET и VB.NET, поэтому существовали некоторые функции, которые разработчики не хотели удалять при вводе .NET. Другой такой особенностью является "On Error Resume Next", которая также не существует в С#.