[英]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.