Почему в C# это не разрешено в инициализаторе члена, но в VB.Net Me разрешено
Я конвертирую приложение VB.Net в C# и заметил, что в коде VB.Net есть закрытая переменная-член, которая инициализируется с помощью Me
как это:
Private m_ClassA As New MyCollection(Of ClassA)(Me)
Когда я конвертирую это в код C#, вот так:
private MyCollection<ClassA> _classA = new MyCollection<ClassA>(this);
У меня ошибка
Аргумент
value
в то время как тип параметраref
,
Если я поставлю ref
перед параметром this
Я получаю ошибку
не можете использовать
this
в инициализаторе члена.
Я читал здесь, что члены инициализируются перед базовым классом, и поэтому this
не может использоваться в элементах, так как он еще не может быть инициализирован. У меня вопрос, почему это законно в VB.Net, а не в C#?
Это связано с тем, что компилятор обрабатывает его по-другому? Кажется странным, что эти двое ведут себя по-разному.
Чтобы обойти это, я предполагаю, что я инициализирую член в конструкторе.
2 ответа
В соответствии с 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 предоставляет способ ссылки на конкретный экземпляр класса или структуры, в которой в данный момент выполняется код. Me ведет себя как переменная объекта или структурная переменная, ссылающаяся на текущий экземпляр.
Похоже, что после выполнения класса вы получите доступ к this
, но только внутри методов экземпляра, тогда как в VB.NET
вы получаете доступ во время выполнения класса, поэтому причина, по которой вы не можете использовать его, как вы заявили.
VB существовал до.NET и VB.NET, поэтому существовали некоторые функции, которые разработчики не хотели удалять при представлении.NET. Еще одна такая функция - "On Error Resume Next", которая также не существует в C#.