Почему VB не предотвращает использование "Me" в инициализации поля, как C# делает с "this"?

В VB вы можете иметь это:

Class One
    Private myTwo As Two = New Two(Me)
End Class

Class Two
    Sub New(withOne As One)

    End Sub
End Class

Но в C# вы не можете сделать это:

class One
{
    private Two myTwo = new Two(this);
}

class Two
{
    public Two(One withOne)
    {

    }
}

Потому что вы получаете сообщение об ошибке "Ключевое слово" это "недоступно в текущем контексте".

Я нашел этот вопрос / ответ, который цитирует раздел спецификации языка C# 7.6.7:

7.6.7 Этот доступ

Этот доступ разрешен только в блоке конструктора экземпляра, метода экземпляра или средства доступа к экземпляру. ... (подробности опущены) ... Использование этого в первичном выражении в контексте, отличном от перечисленных выше, является ошибкой во время компиляции. В
в частности, на это нельзя ссылаться в статическом методе, статическом свойстве
accessor, или в переменной-инициализаторе объявления поля.

Кроме того, этот вопрос охватывает этот вопрос (хотя, по моему выбору, на него недостаточно ответа), и ответ Oblivious Sage на мой вопрос здесь объясняет почему - потому что это функция предотвращения ошибок.

Почему эта функция была исключена из VB?

1 ответ

Решение

Как описано в этом вопросе, отличие состоит в том, что конструкторы запускаются перед инициализаторами полей в VB.NET, но после инициализаторов полей в C#. Поэтому в VB.NET Me является допустимой ссылкой при запуске инициализаторов, но в C# this еще не является действительной ссылкой, когда они запускаются.

Пер Эрик Липперт C# сделал это таким образом, чтобы они могли гарантировать, что поля только для чтения всегда инициализируются до того, как на них можно будет ссылаться.

Я не видел, чтобы это было явно указано где-либо, но если бы мне пришлось угадывать, они заметили этот недостаток в VB.NET, когда C# все еще разрабатывался; Затем они почувствовали, что это достаточно большая проблема, которую стоит исправить в C#, но не достаточно большая проблема, чтобы внести решающее (и, вероятно, обширное) изменение в VB.NET.

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