はじめことなく、複数の==演算子のオーバーロード:
私は同じ仕事をいくつかのクラスを持っていますが、異なる値の型を持つ(フロートや整数の例えばベクトル)。
今、私は平等をチェックできるようにしたいと考えています。この平等は型間でも働くべきです(vectorF == vectorIなど)。
また、ヌルチェック(vectorF == null)も可能である必要があります。C#の、あいまいなヌルチェック
アプローチ:!
私のアプローチは、複数の==のためのオーバーロードと=演算子、各可能な組み合わせのための1つを作成することです。
public sealed class VectorF
{
[...]
public static bool operator == (VectorF left, VectorI right)
{
// Implementation...
}
public static bool operator == (VectorF left, VectorF right)
{
// Implementation...
}
// Same for != operator
[...]
}
問題:複数のオーバーロードを使用して
呼び出しがあいまいになるとして、私は、==演算子とはnullチェックを行うことはできません。
var v = new VectorF([...]);
if (v == null) // This call is ambiguous
[...]
代わりにReferenceEqualsまたはnullのキャストを使用する可能性があることに気付いていますが、そのアプローチは深刻な制限です。
var v = new VectorF([...]);
if(object.ReferenceEquals(v, null)) // Would work, is not user friendly.
[...]
if(v == (VectorF)null) // Would also work, is neither user friendly.
[...]
質問:
は、それが普通のNULLチェックを可能にし、異なるベクトル間の等価性チェックを可能にすること、のように==演算子を実装するためにそこに方法は何ですか?
また、これを実装する方法も実装する方法もありますか?
あなたのVectorクラスは本当に不変な構造体であるはずです。そして、「ヌル」の問題は生じない。 (あなたのクラスには2つまたは3つの値しか入っていないと仮定しています) –
[zugzwang](https://en.wikipedia.org/wiki/Zugzwang)のように聞こえます:good = ''=='または '== null '。他の型のベクトルと比較する方法はありますか?例えば。 'VectorF。IsSame(VectorI) '?コンパイラは 'vectorF == vectorI'を試みるとユーザの間違いを表示し、ユーザは比較するメソッドを探します。別のこと: 'float'と' int'を比較することは正確ではありません。最初に 'VectorF'を' VectorI'にキャストし、次に 'VectorI'を比較するのはどうですか? – Sinatr
なぜ左URTが必要なのですか?私はあなたに私たちが過負荷のメソッドの内容を共有することができますか? – levent