测试平等默认值
以下不会编译:测试平等默认值
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
。
什么是测试相等到默认值的正确方法?
为了避免拳击struct
/Nullable<T>
,我会用:
if (EqualityComparer<T>.Default.Equals(value,default(T)))
{
// do stuff
}
这支持实现IEquatable<T>
任何T
,使用object.Equals
作为备份,并处理null
等等(并且自动解除运营商对于Nullable<T>
)。
还有Comparer<T>.Default
它处理比较测试。这处理T
实施IComparable<T>
,回落到IComparable
- 再次处理null
和解除运营商。
你是说'EqualityComparer
更好的表现(减少拳击);考虑'T = int';调用'object.Equals'它必须包含'value'和'default(T)' - 这是两个额外的堆分配+ GC。使用'EqualityComparer
谢谢,Marc!你的解释很棒 – Greg 2009-12-14 00:07:33
什么
object.Equals(value, default(T))
我知道它应该很简单。谢谢。 – Greg 2009-12-13 06:46:04
+1。测试。适用于各种类型:'MyMethod(0); MyMethod
回复评论;并且对于信息来说,'EqualityComparer'是BCL使用的标准实现,例如'Dictionary '。 –
2009-12-13 23:28:31
http://stackoverflow.com/questions/65351/null-or-default-comparsion-of-generic-argument-in-c-sharp – nawfal 2013-04-15 10:28:53