我需要检查null的通用对象,或者默认(T).但我有一个问题......目前我这样做了:
if (typeof(T).IsValueType) { if(default(T).Equals(thing)) // Do something else // Do something else } else { if(thing == null) // Do something else // Do something else }
但后来我最终重复自己......我不喜欢.问题如下:
thing == null;
ReSharper在这里警告可能将值类型与'null'进行比较.
thing == default(T);
这里我得到编译器错误:不能将运算符'=='应用于'T'和'T'类型的操作数.
thing.Equals(null|default(T));
thing
显然可以为null(这就是我必须检查的原因!),因此会导致NullReferenceException.
null|default(T).Equals(thing);
null和default(T)通常也是null ...
这有干净的方法吗?
正确的方法是:
return EqualityComparer.Default.Equals(value, default(T))
没拳击.您甚至可以定义这样的扩展方法:
public static void bool IsDefault(this T value) { return EqualityComparer .Default.Equals(value, default(T)); }
..并像这样调用它:
return entry.IsDefault();
虽然,我个人并不关心T上的扩展方法(例如这个对象IsNull()),因为它有时会妨碍可读性.
如果拳击不是问题,你可以使用:
object.Equals(value, default(T))
当我需要测试值是否为NULL时,我使用下面的方法.我通常在调用任何类型但不是空值的方法时使用它,例如Cache.
public static bool IsNull(this T value) { var type = typeof(T); return (type.IsClass || Nullable.GetUnderlyingType(type) != null) && EqualityComparer .Default.Equals(value, default(T)); }