以下内容无法编译:
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
测试相等于默认值的正确方法是什么?
答案 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))