5

私は先週これに何度か遭遇しました、そして理由を知りたいです-私はグーグルを持っていました、しかし直接関連するものを見つけることができませんでした。

動的メソッドを持つクラスがあり、同じインターフェイスで静的メソッドを追加できます。

public class MyClass
{
    public int MyMethod()
    {
        //do something #1;
    }

    public static int MyMethod()
    {
        //do something
    }
}

これは問題ありませんが、動的メソッドから静的メソッドを呼び出して#1をに置き換えようとすると、return MyClass.MyMethod()「次のメソッドまたはプロパティ間で呼び出しがあいまいです:MyClass.MyMethod()とMyClass.MyMethod()」というエラーが発生します。 .static
メソッドを削除すると、エラーは「オブジェクト参照が必要です..」に変わります。これは理にかなっています。

では、なぜこれがあいまいなのですか?コード内の他の場所から機能する静的メソッドを指定するために、クラス名が前に付けられています。
なぜここにいないのですか?

編集:私は実際に静的メソッドを呼び出す動的メソッドなしでそれをコンパイルしようとしませんでした、私はそれを強調せずにVSを通り過ぎただけでした。
しかし、私が思うに、それでも同様の質問ですが、「一方は静的で、もう一方はそうではないので、なぜ両方が存在できないのですか」が追加されています。

4

2 に答える 2

1

ここに加えて、SOに関する同様の質問があり、同じシグニチャを持つ2つのメソッドを使用できない理由を説明しています。

public class MyClass
{
    public int MyMethod()
    {
        return 0;
    }

    public static int MyMethod() //Here compiler says, that you've already got method MyMethod with same parameter list
    {
        return 0;
    }
}

だから、あなたはそれらの方法をまったく持つことができません

これを見てください

初めに:

メソッドのシグニチャは、メソッドの名前と、左から右の順序で考慮される、各正式なパラメータのタイプと種類(値、参照、または出力)で構成されます。メソッドのシグニチャには、具体的には戻り型が含まれていません。また、右端のパラメータに指定できるparams修飾子も含まれていません。

第二に:

メソッドのオーバーロードにより、クラス、構造体、またはインターフェイスが同じ名前の複数のメソッドを宣言できるようになります。ただし、それらの署名がそのクラス、構造体、またはインターフェイス内で一意である場合に限ります。

編集

そのエラーが発生する理由については、おそらくまだコンパイルしておらず、赤で下線が引かれたエラーが表示されます。コンパイルすると、静的メソッドを呼び出す行ではなく、静的メソッドが定義されている行に青で下線が引かれたエラーが表示されます。

于 2012-09-20T01:45:30.257 に答える
0

では、なぜこれがあいまいなのですか?コード内の他の場所から機能する静的メソッドを指定するために、クラス名が前に付けられています。なぜここにいないのですか?

あいまいな理由は、MyClassにMyClassというインスタンスプロパティを設定できるためです。EricLippertがその理由をより詳細に説明していると思います。その特定の投稿を完全に見つけることはできませんが、ここに彼からの同様のシリーズがあります

于 2012-09-20T01:44:06.567 に答える