说我有一些代码如下:
var someCollection = new int[] {};
var result = someCollection.SingleOrDefault();
然后,我想确定result
是否为默认值。 但是,我希望以可维护的方式执行此操作,以便在someCollection
的元素类型发生更改时,其余代码不需要更改。
这通常似乎完成的方式(一般意义上)是result == null
。在这种情况下,当然,类型不是引用类型,因此这不起作用。
避免这种假设的改进是result == default(int)
。但是,更改元素类型还需要将参数更改为default
,因此仍然不满足仅在一个位置更改类型的要求。
答案 0 :(得分:4)
您可以使用default关键字。由于您不知道类型是什么,因此您可以使用泛型。
public bool IsDefault<T>(T value)
{
return EqualityComparer<T>.Default.Equals(value, default(T));
}
答案 1 :(得分:3)
从Sam那里偷窃并改进它:
public static bool IsDefault<T>(this T value)
{
return value == null || value.Equals(default(T));
}
无需进行型式检查。 JIT会使它工作,因为它知道T在JIT时是什么。
请注意,如果类型覆盖等于,那么它甚至可以说是false 当它是
default(T)
时它可能会说是真的,即使它不是。 - Eric Lippert评论
答案 2 :(得分:2)
我认为这会奏效。
public static bool IsDefault<T>(this T value)
{
var isValueType = typeof(T).IsValueType;
if (isValueType)
return value.Equals(default(T));
else
return value == null;
}
但是,对于值类型,我认为这会调用它们重载的Equals
方法,这可能是也可能不是问题。