在哪里可以获取C#的“ nameof”的源代码或如何对其进行反编译?
我检查了https://referencesource.microsoft.com/,但找不到。
答案 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项目下开源。了解编译器并不是一件容易的事-源代码通过转换管道传递,每个转换管道都添加了更多的语法或语义信息。首先,GetContextualKeywordKind
将nameof
关键字解析为SyntaxKind.NameOfKeyword
,然后在TryBindNameofOperator
中将其匹配。
关于创建另一个这样的运算符的另一个问题:是的,您可以通过克隆和修改Roslyn源来进行。但是,您的新运算符显然只能在修改后的编译器上运行,因此您需要将此代码提供给将要编译代码的任何人。这很少做。通常,最好为自定义功能定义扩展方法,除非您需要特别深奥的东西。