6

同じパラメータで静的メソッドと非静的メソッドを宣言しようとすると、コンパイラはエラーを返します。タイプ「Test」は、同じパラメータタイプで「Load」というメンバーをすでに定義しています。

    class Test
    {
        int i = 0;

        public int I
        {
            get { return i; }
            set { i = value; }
        }

        public bool Load(int newValue)
        {
            i = newValue;
            return true;
        }

        public static Test Load(int newValue)
        {
            Test t = new Test();
            t.I = newValue;
            return t;
        }

私が知る限り、これら2つのメソッドを混在させることはできませんが、静的メソッドはオブジェクトで呼び出されますが、静的メソッドはクラスで呼び出されます。なぜコンパイラはこのようなことを許可せず、同様のことを行う方法があるのでしょうか。

4

7 に答える 7

10

Testクラスに次のようなメソッドがある場合:

public void CallLoad()
{
    Load(5);
}

コンパイラは、どの Load() を使用するかを知りません。クラス名なしで静的メソッドを呼び出すことは、クラス メンバーに対して完全に許可されています。

static同様のことを行う方法については、メソッドの名前をLoadTest()またはに変更するなど、メソッドに似ているが異なる名前を付けることが最善の策だと思いますLoadItem()

于 2013-01-14T10:04:58.033 に答える
4

クラス自体の内部では、インスタンスまたはクラス名なしでインスタンス メソッドと静的メソッドの両方を呼び出すため、名前とパラメーターが同じ場合は 2 つを区別できなくなります。

class Test
{
    public void Foo()
    {
        Load(0); // Are you trying to call the static or the instance method?
    }

    // ...
}
于 2013-01-14T10:04:50.040 に答える
1

メソッドのシグネチャは、名前とパラメーター (数値と型) の組み合わせです。

あなたの場合、2 つのメソッドは同じ同一の署名を持っています。1 つが静的で、もう 1 つがそうでないという事実は、それらをクラスの有効なメソッドとして受け入れることに違いはありません。

于 2013-01-14T10:13:57.257 に答える
0

この問題は、書き込みthisclassname. C# 仕様では、オブジェクト インスタンスを使用して静的メソッドを呼び出すことができます。

AClass objectA = new AClass();
objectA.CallStaticMethod();

このコードは有効であるため、コンパイラは静的メソッドとインスタンス メソッドのどちらを呼び出しているかを知る方法がありません。

于 2013-01-14T10:14:15.343 に答える
0

私はそうは思わない。このクラスの非静的メソッドが Load(intValue) を呼び出した場合。どのメソッドが呼び出されますか?

于 2013-01-14T10:05:30.617 に答える
0

どちらのメソッドも同じ名前で、同じクラス (スコープ) で定義され、同じシグネチャを持ちます。C# はこれを許可しません。

于 2013-01-14T10:06:15.553 に答える
0

C# では、戻り値の型によってメソッドをオーバーロードできません。メソッドが静的であるかどうかに関係なく、少なくとも異なるパラメーターのセットが必要です。

于 2013-01-14T10:43:17.123 に答える