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