簡體   English   中英

為什么C#編譯器重載解析算法將具有相同簽名的靜態和實例成員視為相等?

[英]Why does C# compiler overload resolution algorithm treat static and instance members with equal signature as equal?

讓我們有兩個成員相同的簽名,但一個是靜態的而另一個是 - 不是:

class Foo
{
    public void Test() { Console.WriteLine("instance"); }

    public static void Test() { Console.WriteLine("static"); }
}

但是這樣的代碼生成會帶來編譯錯誤:

類型'Foo'已經定義了一個名為'Test'的成員,它具有相同的參數類型

但為什么?

讓我們成功編譯,然后:

  • Foo.Test()應輸出“static”

  • new Foo().Test(); 應該輸出“實例”

無法調用靜態成員而不是實例1,因為在這種情況下會出現另一個更合理的編譯器錯誤:

無法使用實例引用訪問成員'Foo.Test()'; 用類型名稱來限定它

從實例方法怎么樣:

Test();

那叫什么? 您可能希望為靜態方法賦予實例方法“優先級”,但兩者都適用。

我會說,即使它被允許,從可讀性的角度來看這是一個根本不好的想法...例如,如果你改變了一個名為Test的方法,從靜態到實例,它會改變意思是微妙的。

換句話說,我對此被禁止沒有問題:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM