[英]Source code for the “nameof” operator of C#
您不能像这样反编译或显示源代码。 它是C#编译器的一部分:当您使用nameof(Foo)
,编译器仅将“ Foo”注入源代码。 方法的IL 完全相同 :
static void PrintMyName()
{
Console.WriteLine(nameof(PrintMyName));
}
与
static void PrintMyName()
{
Console.WriteLine("PrintMyName");
}
正如评论中所指出的,不仅仅是名称按字面意思按照操作数使用;还包括 这是所用名称的最后一部分。 因此,例如,如果您有:
string x = "10";
string text = nameof(x.Length);
然后将解析为“长度”。 (或者,在执行时不使用x
的值-如果x
为null很好。或者您可以使用nameof(string.Length)
或nameof(String.Length)
。)
nameof
是关键字,因此您需要查看编译器以获取如何处理它的源代码。 对您来说幸运的是,C#编译器现在在Roslyn项目下开源。 了解编译器并不是一件容易的事-源代码通过转换管道传递,每个转换管道都添加了更多的语法或语义信息。 首先, GetContextualKeywordKind
将nameof
关键字解析为SyntaxKind.NameOfKeyword
,然后在TryBindNameofOperator
进行匹配。
关于创建另一个这样的运算符的另一个问题:是的,您可以通过克隆和修改Roslyn源代码来实现。 但是,您的新运算符显然只能在修改后的编译器上运行,因此您需要将此代码提供给将要编译代码的任何人。 这很少做。 通常,最好为自定义功能定义扩展方法,除非您需要特别深奥的东西。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.