测试相等于默认值

时间:2009-12-13 06:42:57

标签: c# generics equality

以下内容无法编译:

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

错误:Operator '==' cannot be applied to operands of type 'T' and 'T'

我无法使用value == null,因为T可能是一个结构 我无法使用value.Equals(default(T)),因为value可能是null 测试相等于默认值的正确方法是什么?

2 个答案:

答案 0 :(得分:71)

为避免装箱struct / Nullable<T>,我会使用:

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

这支持使用T作为备份实施IEquatable<T>的任何object.Equals,并自动处理null等(并提升Nullable<T>的运算符)。

还有Comparer<T>.Default处理比较测试。这会处理实施T的{​​{1}},回退到IComparable<T> - 再次处理IComparable并解除运算符。

答案 1 :(得分:25)

怎么样?
object.Equals(value, default(T))