Почему компилятор не выдает никаких ошибок или предупреждений при использовании этого хака?
В моем другом вопросе я нашел способ заставить этот синтаксис работать в редакторе MonoDevelop:
// hack to make MonoDevelop recognize nameof syntax from C#6.0
using nameof = System.Func<string>;
Компиляторы C# (Mono и VS) не выдают никаких предупреждений или ошибок, а также используют nameof
Ключевое слово также работает нормально. У меня вопрос почему.
1 ответ
Я не адвокат по языкам, но я считаю, что причина того, что ваш код работает, заключается в том, что nameof
это контекстное ключевое слово
Давайте вернемся к более общему случаю. Если вы попытаетесь создать using alias directive
по ключевому слову if
вы получаете ошибку...
using if = System.Func<string>; // "CS1001: Identifier expected" error
... если вы не префикс имени с @
...
using @if = System.Func<string>; // No "CS1001: Identifier expected" error
Точно так же вы получаете ошибку CS1003, если вы пытаетесь объявить переменную типа aliased...
if foo = () => "Hello, World"; // "CS1003: Syntax error, '(' expected" error
... если вы не префикс имени с @
знак …
@if foo = () => "Hello, World"; // No "CS1003: Syntax error, '(' expected" error
С другой стороны, контекстные ключевые слова не должны начинаться с префикса @
...
using nameof = System.Func<string>;
nameof bar = () => "Hello, World!";
Console.WriteLine(nameof(nameof));