我需要检查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 ...
这有干净的方法吗?
Jas*_*son 54
正确的方法是:
return EqualityComparer<T>.Default.Equals(value, default(T))
没拳击.您甚至可以定义这样的扩展方法:
public static void bool IsDefault<T>(this T value)
{
    return EqualityComparer<T>.Default.Equals(value, default(T));
}
..并像这样调用它:
return entry.IsDefault();
虽然,我个人并不关心T上的扩展方法(例如这个对象IsNull()),因为它有时会妨碍可读性.
Jef*_*tes 26
如果拳击不是问题,你可以使用:
object.Equals(value, default(T))
当我需要测试值是否为NULL时,我使用下面的方法.我通常在调用任何类型但不是空值的方法时使用它,例如Cache.
public static bool IsNull<T>(this T value)
{
    var type = typeof(T);
    return (type.IsClass || Nullable.GetUnderlyingType(type) != null) 
        && EqualityComparer<T>.Default.Equals(value, default(T));
}
| 归档时间: | 
 | 
| 查看次数: | 8480 次 | 
| 最近记录: |