簡體   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