首頁>Program>source

我在C#中有一个同時具有靜態和非靜態介面的類.可以在具有相同名稱和簽名的類中使用靜態和非靜態方法吗?

当我尝試執行此操作時遇到編譯器錯誤,但是由於某種原因,我认為有一種方法可以執行此操作.我是錯誤的還是没有办法在同一个類中同時使用靜態和非靜態方法?

如果這不可能,是否有一種很好的方法来實現可普遍應用於任何情况的類似內容?

EDIT
从我收到的答複来看,顯然没有办法做到這一點.我要使用其他命名系統来解決此問题。

最新回復
  • 5月前
    1 #

    不,您不能.进行限製的原因是,也可以从非靜態上下文中呼叫靜態方法,而無需添加類名(因此,可以使用MyStaticMethod()代替MyClass.MyStaticMethod()).如果两者兼有,編譯器將無法確定您要查詢的內容.

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

  • 5月前
    2 #

    實際上, 一種是通過顯式實現介面来實現此目的的方法.這不是一个完美的解決方案,但在某些情况下可以使用。

    interface IFoo
    {
        void Bar();
    }
    class Foo : IFoo
    {
        static void Bar()
        {
        }
        void IFoo.Bar()
        {
            Bar();
        }
    }
    

    有時在為P / Invoke呼叫建立包裝類時会遇到這種情况。

  • 5月前
    3 #

    您可以从例項方法中呼叫靜態方法,而不必指定型別名稱:

    class Foo
    {
        static void Bar()
        {
        }
        void Fizz()
        {
            Bar();
        }
    }
    

    ...因此,不允许您使用具有相同簽名的靜態方法和例項方法是有道理的。

    您要完成什麼? 在不了解具體细节的情况下很难提出解決方法.我只是重命名其中一種方法。

  • 5月前
    4 #

    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
       }
    }
    

  • 5月前
    5 #

    可以使用具有相同名稱的靜態方法和例項方法,只要它们的宣告在引數的數量或型別上有所不同即可.關於如何在一个類中拥有两个具有相同名稱的例項方法,這是相同的規則。

    尽管从技術上讲,在靜態方法与例項方法的情况下,它们已经因例項方法中隱式this引數的存在而有所不同,但這種差異不足以使編譯器確定要呼叫的是哪两个方法

    Update : 我犯了一个錯誤.返迴值不足以具有不同的簽名。

  • java:Android Studio TransformException:錯誤:任務':app:transformClasseswithDexForDebug'的執行失败
  • http:通過Javascript將cookie設置為HttpOnly