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

时间:2018-08-25 16:32:31

标签: c# .net

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

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

2 个答案:

答案 0 :(得分:9)

这不是您可以反编译或向您显示源代码的东西。它是C#编译器的一部分:当您使用nameof(Foo)时,编译器仅将“ Foo”注入源代码。这些方法的IL完全相同:

static void PrintMyName()
{
    Console.WriteLine(nameof(PrintMyName));
}

vs

static void PrintMyName()
{
    Console.WriteLine("PrintMyName");
}

正如注释中所指出的,不仅仅是名称按字面意义按照操作数使用;而且这是所用名称的最后一部分。例如,如果您有:

string x = "10";
string text = nameof(x.Length);

然后将解析为“长度”。 (这在执行时不使用x的值,或者-如果x为null很好。或者您可以使用nameof(string.Length)nameof(String.Length)。)

答案 1 :(得分:2)

nameof是一个关键字,因此您需要查看编译器以获取如何处理它的源代码。对您来说幸运的是,C#编译器现已在Roslyn项目下开源。了解编译器并不是一件容易的事-源代码通过转换管道传递,每个转换管道都添加了更多的语法或语义信息。首先,GetContextualKeywordKindnameof关键字解析为SyntaxKind.NameOfKeyword,然后在TryBindNameofOperator中将其匹配。

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