1

したがって、コンパイラは、クラスの == および != 演算子をオーバーロードすることを許可しません。クラスは次のようになります。

public class Item
{
    public string _name;
    public double _weight;
    public decimal _wholesalePrice;
    public int _quantity;

    public Item(string name, double weight, decimal wholesalePrice, int quantity)
    {
        _name = name;
        _weight = weight;
        _wholesalePrice = wholesalePrice;
        _quantity = quantity;
    }

    public static override bool operator ==(Item left, Item right)
    {
        if (left._name == right._name)
        {
            return true;
        }
        return false;
    }

    public static override bool operator !=(Item left,Item right)
    {
        return !(left == right);
    }
}

コンパイラは、「修飾子 'override' はこの項目に対して有効ではありません。最初は、基本メソッドを仮想として宣言していないのではないかと思っていましたが、クラスは派生していません。何が起こっているのか考えていますか?

4

3 に答える 3

2

親クラスからクラスを派生させない限り、オーバーライドを宣言することはできません。また、静的メソッドでオーバーライドを宣言することもできません。オーバーライドをまとめて削除しようとしましたか? それは私のために働くようです...

public class Item
{
    public string _name;
    public double _weight;
    public decimal _wholesalePrice;
    public int _quantity;

    public Item(string name, double weight, decimal wholesalePrice, int quantity)
    {
        _name = name;
        _weight = weight;
        _wholesalePrice = wholesalePrice;
        _quantity = quantity;
    }

    public static bool operator ==(Item left, Item right)
    {
        if (left._name == right._name)
        {
            return true;
        }
        return false;
    }

    public static bool operator !=(Item left, Item right)
    {
        return !(left == right);
    }
}

補足として、== および != 演算子をオーバーライドする場合は、GetHashCode および Equals メソッドもオーバーライドすることをお勧めします。

于 2012-07-29T05:34:34.740 に答える
1

==または!=演算子を持たないクラスObjectからクラスを派生させています。したがって、これらの演算子をオーバーライドすることはできません。

さらに、静的演算子またはメソッドをオーバーライドすることはできません。オーバーライドできるのはインスタンスメソッドのみです。

最後に、オーバーライドとオーバーロードは2つの非常に異なるものであることに注意してください。オーバーロードとは、名前は同じで署名が異なる(パラメーターが異なるなど)メソッドの定義が複数ある場合です。

于 2012-07-29T05:41:55.317 に答える
0

簡単に言えば、構文にキーワードがpublic static bool operator ==(Item left, Item right)ないということです。override

これは、オーバーライドではなく、演算子のオーバーロードと呼ばれます。

==2 つのパラメーターを取る一種の静的メソッド (架空の「グローバル」クラス内)と考えることができます。コンパイラが次のようなものを見たとき

xxx == yyy

オーバーロード解決を使用して、使用するものを見つけ==ます。これは、

Meth(xxx, yyy)

ここで、コンパイラは、などMeth(Object, Object)のオーバーロードを考慮し、それらのどれが (もしあれば) のコンパイル時の型に最も適しているかを見つけます。Meth(String, String)Meth(Item, Item)xxxyyy

もちろん、これは単なるアノロジーですが、演算子をいつ変更するかではstaticなく、なぜ含めるかを思い出すのに役立ちます。override==

于 2012-07-29T06:09:30.297 に答える