测试是否与默认值相等

以下内容无法编译:

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可能是一个 struct。
我不能使用 value.Equals(default(T)),因为 value可能是 null
测试是否与默认值相等的正确方法是什么?

31002 次浏览

关于什么

object.Equals(value, default(T))

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

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

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

还有处理比较测试的 Comparer<T>.Default。这处理实现 IComparable<T>T,回落到 IComparable-再次处理 null和提升操作符。