visualstudio


演算子 '==' を 'T' と 'T' 型のオペランドに適用することはできません の対策方法です



ジェネリクスメソッドを書いていて比較をしたいときに

static bool Compare<T>(T a, T b)
{
    return a == b; 
}


このように書いたりしませんか?
しかしこの場合は
「演算子 '==' を 'T' と 'T' 型のオペランドに適用することはできません」というおよそ日本語とは思えないエラーメッセージが表示されます。

 要するに型がわからないんですね。
ではわかるようにしてあげましょう。
一般的な方法として以下の2つをご紹介します。どちらを使っても結果は同じものになります。



static bool Compare<T>(T a, T b)
{
    return EqualityComparer<T>.Default.Equals(a, b);
}




static bool Compare<T>(T a, T b)
{
    return Comparer<T>.Default.Compare(a, b) == 0;
}


Comparer<T>.Default.Compare() メソッドは bool 値ではなく int 値を返します。
a が b より小さい場合は負の値を、同じ場合は 0 を、大きい場合は正の値を返します。
しかしこれは本来並び替えに使うもので、同値比較とはニュアンスが違いますので ①のEqualityComparer<T>.Default.Equals() を使って比較を行いましょう。