2

C# クラスは基本クラスからカスタム演算子を継承しますか? 私は次のコードを試しています:

class Person
{
    public int Age;

    public static Person operator ++(Person p)
    {
        p.Age++;
        return p;
    }
}

class Agent : Person {   }

static void Main(string[] args)
{
    Person p = new Person { Age = 23 };
    Console.WriteLine ( "Before increment : {0}" , p.Age );

    p++;
    Console.WriteLine("After increment : {0}", p.Age);

    Agent agent = new Agent { Age = 25 };
    Console.WriteLine("Before increment : {0}", agent.Age);

    agent++;
    Console.WriteLine("After increment : {0}", agent.Age);

}

コンパイラは、Person から Agent に明示的に変換することはできないと私に言いました。

私は試した :

Agent agent = new Agent();
Person person = agent ++

ただし、同じコンパイラ メッセージが表示されます。

4

5 に答える 5

2

演算子は静的として実装され、継承は静的メンバーには適用されません。

一部の演算子は派生型で機能し、一部は機能しません。型変換規則の問題です。

しかし、とにかく、基本的にPerson p = ...; p++;は非常に悪い考えです。適切な場所で演算子のオーバーロードを使用すると、このような問題に遭遇することはありません。

于 2013-11-01T10:24:15.120 に答える
2

アップデート:

他のメンバーと同様に、基底クラスで宣言された演算子は派生クラスに継承されます。演算子の宣言では常に、演算子が宣言されているクラスまたは構造体が演算子のシグネチャに参加する必要があるため、派生クラスで宣言された演算子が、基底クラスで宣言された演算子を非表示にすることはできません。したがって、 new 修飾子は、演算子宣言では決して必要とされないため、決して許可されません。

上記のc# 言語仕様からの引用


コンパイラは、継承階層で定義された演算子のオーバーロードを確認します。見つかった場合はそれを使用します

次のコードを検討してください

class Person
{
    public int Age;
    public static int operator +(Person p, Person p2)
    {
        return p.Age + p2.Age;
    }
}
class Agent : Person
{

}
static void Main()
{
    Person p = new Person { Age = 23 };
    Agent agent = new Agent { Age = 25 };

    int res = p + agent;//Result 48
    Console.WriteLine("Result is "+ res);
}

あなたの場合、コンパイラは++演算子を見つけて使用しようとしましたが、問題は戻り値の型にあります。基本型を返すため、機能しません。それ以上の派生型に割り当てることはできません。

デモはこちら

于 2013-11-01T10:25:42.423 に答える