[C#] 同じ名前の静的メソッドとインスタンスメソッド


Answers

実際には、インタフェースを明示的に実装することでこれを実現する方法があります。 それは完璧な解決策ではありませんが、場合によっては機能します。

interface IFoo
{
    void Bar();
}

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

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

P / Invoke呼び出しのラッパークラスを作成すると、この状況に陥ることがあります。

Question

私はC#で静的と非静的の両方のインターフェイスを持つクラスを持っています。 同じ名前と署名を持つクラスに静的メソッドと非静的メソッドを持つことは可能ですか?

これをやろうとするとコンパイラエラーが出ますが、何らかの理由でこれを行う方法があると思いました。 私は間違っているのですか、同じクラスに静的メソッドと非静的メソッドの両方を持つ方法がありませんか?

これが不可能な場合は、一般的にどのような状況にも適用できる、このようなものを実装する良い方法がありますか?

EDIT
私が受け取った回答から、これを行う方法がないことは明らかです。 この問題を回避するには、別の命名システムを使用しています。




C#は、これについてはよく設計されていません...

グローバルまたは非グローバルを望むことが本当であるのは間違いありませんが、デフォルトでは1つを選択する必要があります。

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



OK。 この問題の根本は、C#は型名を指定せずにインスタンスメソッドから静的メソッドを呼び出さないようにすべきです。

他の全てのオブジェクト指向言語(Smalltalkのような)はこれを許さず、オブジェクトを理解している人たちに混乱させます。 インスタンス側とクラス(または静的)側の分離は非常に重要であり、これらの詳細の混乱を助長する言語を持つことは良い考えではありません....しかし、我々が期待しているタイプのものの典型ですMSから。

エイドリアン