Почему в 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#.

Другие вопросы по тегам