69

以下内容无法编译:

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
测试与默认值是否相等的正确方法是什么?

4

2 回答 2

102

为了避免为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执行IComparable<T>、回退到IComparable再次处理null和提升操作员。

于 2009-12-13T09:44:49.310 回答
34

关于什么

object.Equals(value, default(T))
于 2009-12-13T06:44:39.087 回答