web-dev-qa-db-ja.com

デフォルト値と等しいかどうかをテストします

以下はコンパイルされません:

_public void MyMethod<T>(T value)
{
    if (value == default(T))
    {
        // do stuff
    }
}
_

エラー:_Operator '==' cannot be applied to operands of type 'T' and 'T'_

Tは構造体の可能性があるため、_value == null_は使用できません。
valuenullである可能性があるため、value.Equals(default(T))を使用できません。
デフォルト値と等しいかどうかをテストする適切な方法は何ですか?

50
Greg

struct/Nullable<T>のボクシングを回避するには、次のようにします。

if (EqualityComparer<T>.Default.Equals(value,default(T)))
{
    // do stuff
}

これは、バックアップとしてIEquatable<T>を使用し、object.Equalsを実装するすべてのTをサポートし、nullなど(およびNullable<T>のリフト演算子)を自動的に処理します。

比較テストを処理するComparer<T>.Defaultもあります。これはIComparable<T>を実装するTを処理し、IComparableにフォールバックします-nullおよびリフトされた演算子を再び処理します。

77
Marc Gravell

どうですか

object.Equals(value, default(T))
28
Graviton