Подтвердить что ты не робот

Почему в С# это не разрешено в инициализаторе члена, но в 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, а не С#?

Разве это не так, как компилятор обрабатывает его по-другому? Кажется странным, что у двух есть разные формы поведения.

Чтобы обойти это, я предполагаю, что инициализирую член в конструкторе.

4b9b3361

Ответ 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", которая также не существует в С#.