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

2021/09/02に公開

ジェネリックメソッドを書いていて困ったことはありませんか?
次のコードはコンパイルできません。

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

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

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 値を返します。
ab より小さい場合は負の値を、同じ場合は 0 を、大きい場合は正の値を返します。
しかしこれは本来並び替えに使うもので、同値比較とはニュアンスが違いますので EqualityComparer<T>.Default.Equals() を使いましょう。

執筆日: 2018/03/22

GitHubで編集を提案

Discussion