MSDN==
のオペレーターのドキュメントによると、
事前定義された値型の場合、等価演算子(==)は、オペランドの値が等しい場合はtrueを返し、そうでない場合はfalseを返します。文字列以外の参照型の場合、2つのオペランドが同じオブジェクトを参照している場合、==はtrueを返します。文字列タイプの場合、==は文字列の値を比較します。ユーザー定義の値型は、==演算子をオーバーロードする可能性があります(演算子を参照)。したがって、ユーザー定義の参照型も可能ですが 、デフォルトでは、==は、事前定義された参照型とユーザー定義の参照型の両方について上記のように動作します。
では、なぜこのコードスニペットはコンパイルに失敗するのでしょうか。
bool Compare<T>(T x, T y) { return x == y; }
エラー演算子'=='はタイプ'T'および'T'のオペランドには適用できません。私が理解している限り、==
演算子はすべてのタイプに対して事前定義されているので、なぜだろうか?
編集:ありがとう、みんな。最初は、ステートメントが参照型のみに関するものであることに気づきませんでした。また、すべての値型に対してビットごとの比較が提供されていると思いましたが、これは正しくないことがわかりました。
しかし、参照型を使用している場合、==
演算子は事前定義された参照比較を使用しますか、それとも型が定義されている場合はオーバーロードされたバージョンの演算子を使用しますか?
編集2:試行錯誤の==
結果、無制限のジェネリック型を使用する場合、オペレーターは事前定義された参照比較を使用することがわかりました。実際、コンパイラーは、制限された型の引数に対して見つけることができる最良の方法を使用しますが、それ以上探すことはありません。たとえば、以下のコードは、が呼び出されtrue
た場合でも常に出力されます。Test.test<B>(new B(), new B())
class A { public static bool operator==(A x, A y) { return true; } }
class B : A { public static bool operator==(B x, B y) { return false; } }
class Test { void test<T>(T a, T b) where T : A { Console.WriteLine(a == b); } }