繁体   English   中英

C#的“ nameof”运算符的源代码

[英]Source code for the “nameof” operator of C#

在哪里可以获取C#的“ nameof”源代码或如何对其进行反编译?

我检查了https://referencesource.microsoft.com/ ,但找不到。

您不能像这样反编译或显示源代码。 它是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项目下开源。 了解编译器并不是一件容易的事-源代码通过转换管道传递,每个转换管道都添加了更多的语法或语义信息。 首先, GetContextualKeywordKindnameof关键字解析为SyntaxKind.NameOfKeyword ,然后在TryBindNameofOperator进行匹配。

关于创建另一个这样的运算符的另一个问题:是的,您可以通过克隆和修改Roslyn源代码来实现。 但是,您的新运算符显然只能在修改后的编译器上运行,因此您需要将此代码提供给将要编译代码的任何人。 这很少做。 通常,最好为自定义功能定义扩展方法,除非您需要特别深奥的东西。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM