簡體   English   中英

靜態和實例方法同名?

[英]Static and Instance methods with the same name?

我在C#中有一個同時具有靜態和非靜態接口的類。 是否可以在具有相同名稱和簽名的類中使用靜態和非靜態方法?

嘗試執行此操作時出現編譯器錯誤,但是由於某種原因,我認為有一種方法可以執行此操作。 我是錯的還是沒有辦法在同一個類中同時使用靜態和非靜態方法?

如果無法做到這一點,是否有一個很好的方法來實現可以在任何情況下普遍應用的類似功能?

編輯
從我收到的答復來看,顯然沒有辦法做到這一點。 我要使用其他命名系統來解決此問題。

不,你不能。 進行限制的原因是,也可以從非靜態上下文中調用靜態方法,而無需添加類名(因此,可以使用MyStaticMethod()代替MyClass.MyStaticMethod())。 如果兩者兼有,編譯器將無法確定您要查找的內容。

您可以使用具有相同名稱的靜態方法和非靜態方法,但是不同的參數遵循與方法重載相同的規則,它們不能具有完全相同的簽名。

實際上,有一種方法可以通過顯式實現接口來實現。 這不是一個完美的解決方案,但在某些情況下可以使用。

interface IFoo
{
    void Bar();
}

class Foo : IFoo
{
    static void Bar()
    {
    }

    void IFoo.Bar()
    {
        Bar();
    }
}

在為P / Invoke調用創建包裝類時,有時會遇到這種情況。

您可以從實例方法中調用靜態方法,而不必指定類型名稱:

class Foo
{
    static void Bar()
    {
    }

    void Fizz()
    {
        Bar();
    }
}

...這樣就可以避免您使用具有相同簽名的靜態方法和實例方法。

你想達到什么目的? 在不了解具體細節的情況下很難提出解決方法。 我只是重命名其中一種方法。

就此而言,C#的設計不是很好。

雖然確實可以選擇全局或非全局,但默認情況下應該選擇一個,如果想要另一個,則只需對其進行更多限定即可。

class Logger {
   public static Logger instance;

   public static void Log(string message) {
       instance.Log(message); // currently the compiler thinks this is ambiguous, but really its not at all.  Clearly we want the non-static method
   }

   public void Log(string message) {

   }

   public void DoStuff() {
      Log("doing instance stuff"); // this could be ambiguous, but in my opinion it should default to a call to this.Log()
      Logger.Log("doing global stuff"); // if you want the global qualify it explicitly
   }
}

只要靜態方法和實例方法的聲明在參數數量或類型上不同,就可以使它們具有相同的名稱。 關於如何在一個類中擁有兩個具有相同名稱的實例方法,這是相同的規則。

盡管從技術上講,在靜態方法與實例方法的情況下,它們已經因實例方法中隱式this參數的存在而有所不同,但這種差異不足以使編譯器確定要調用的是哪兩個。

更新 :我弄錯了。 返回值不足以具有不同的簽名。

好。 此問題的根源是C#不應允許您在未指定類型名稱的情況下從實例方法調用靜態方法。

其他完整的OO語言(例如Smalltalk)不允許這樣做,並且這對於理解對象的人來說也很混亂。 實例端與類端(或靜態端)之間的分隔非常重要,使用一種語言來促進這些細節上的混淆是........不是一個好主意。來自MS。

阿德里安

暫無
暫無

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

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