我有一个这样定义的泛型方法:
public void MyMethod<T>(T myArgument)
我要做的第一件事是检查myArgument的值是否为该类型的默认值,就像这样:
if (myArgument == default(T))
但这不能编译,因为我不能保证T会实现==运算符。所以我把代码转换成这样:
if (myArgument.Equals(default(T)))
现在这个编译了,但是如果myArgument为null就会失败,这是我测试的一部分。我可以像这样添加一个显式的空检查:
if (myArgument == null || myArgument.Equals(default(T)))
现在我觉得这是多余的。ReSharper甚至建议我将myArgument == null部分更改为myArgument == default(T),这是我开始的地方。有没有更好的方法来解决这个问题?
我需要同时支持引用类型和值类型。
基于公认答案的扩展方法。
public static bool IsDefault<T>(this T inObj)
{
return EqualityComparer<T>.Default.Equals(inObj, default);
}
用法:
private bool SomeMethod(){
var tValue = GetMyObject<MyObjectType>();
if (tValue == null || tValue.IsDefault()) return false;
}
替换null来简化:
public static bool IsNullOrDefault<T>(this T inObj)
{
if (inObj == null) return true;
return EqualityComparer<T>.Default.Equals(inObj, default);
}
用法:
private bool SomeMethod(){
var tValue = GetMyObject<MyObjectType>();
if (tValue.IsNullOrDefault()) return false;
}