3

これは有効ですか?

public struct MyStruct
{
    public int Foo { get; set; }

    public static bool operator ==(MyStruct a, MyStruct b)
    {
        return a.Equals(b);
    }

    public static bool operator !=(MyStruct a, MyStruct b)
    {
        return !a.Equals(b);
    }
}

(Object.Equalsはデフォルトで値型にリフレクションを使用するため、少し非効率的ですが、有効ですか?)

ReSharperがそれを強調し、私に警告するので、私は尋ねていMyStruct defines operator '==' or operator '!=' but does not provide 'Object.Equals(object o)' and 'Object.GetHashCode()'ます。

4

3 に答える 3

4

これは面白いかもしれないと思います。

于 2010-09-06T08:13:30.470 に答える
3

有効?はい。しかし、それはあなたに何も買わない。

于 2010-09-06T08:08:38.160 に答える
2

コンパイルするという点で有効です。ただし、クラスのユーザーのすべての期待を破るという意味で「無効」です。フレームワークの設計ガイドラインでは、演算子のオーバーロードにのみ存在する機能を実装しないように指定されています。このようなメソッドには、他の方法でアクセスできる必要があります。そして標準は、Object.Equalsとoperator==が同じ機能を実装することです。

(現時点では、ガイドラインの1.1バージョンのみを見つけることができます)

代替の署名を提供します。ほとんどの言語は、演算子のオーバーロードをサポートしていません。このため、演算子をオーバーロードするすべてのタイプのCLS要件は、同等の機能を提供する適切なドメイン固有の名前を持つセカンダリメソッドを含めることです。この二次的な方法を提供することは、共通言語仕様(CLS)の要件です。次の例はCLSに準拠しています。

于 2010-09-06T08:10:14.507 に答える