为什么在使用此hack时编译器为什么不给出任何错误或警告?

时间:2018-07-21 15:33:36

标签: c# syntax c#-6.0 nameof

在我的other question中,我发现了一个可在MonoDevelop编辑器中使此语法正常工作的技巧:

// hack to make MonoDevelop recognize nameof syntax from C#6.0
using nameof = System.Func<string>;

C#编译器(Mono和VS)不发出任何警告或错误,并且nameof关键字的用法也可以正常工作。我的问题是为什么。

1 个答案:

答案 0 :(得分:2)

不是语言律师,但我相信您的代码有效的原因是nameofcontextual keyword

让我们回到更一般的情况。如果您尝试为关键字if创建一个using alias directive,则会出现错误...

using if = System.Func<string>;  // "CS1001: Identifier expected" error

...,除非您在名称前加上@ ...

using @if = System.Func<string>;  // No "CS1001: Identifier expected" error

类似地,如果您尝试声明别名类型的变量,则会出现CS1003错误...

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));