所以,我在应用程序中做了很多数据库工作 - 我的缓存系统有几种可能的返回值。它可以返回null,它可以返回默认值(类型),也可以返回无效对象(无效对象,我的意思是属性/值不正确)。我想创建一个扩展方法来为我做所有这些检查,如下所示:
public static bool Valid<T> (this T obj) where T: class
{
if (obj == null)
return false;
else if (obj == default(T))
return false;
//Other class checks here
else
return true;
}
问题是,我的编译器告诉我if (obj == default(T))
总是假的。
为什么?
答案 0 :(得分:21)
由于您有“类”约束(where T: class
),default(T)
始终等于null。您已经在原始if语句中检查了它,因此第二种情况(obj == default(T)
)永远不会成立。
答案 1 :(得分:1)
我不确定你是否因为你想要或因为你认为必须而将它限制在课堂上。如果是后者,这里有一种对复杂和简单类型进行默认值检查的方法:
public static bool Valid<T> (this T obj)
{
return !EqualityComparer<T>.Default.Equals(obj, default(T));
}
如果您选择将其限制在课堂上只是故意或商业案例,请随意忽略此建议。另外一件事可能没有解释的是简单类型的装箱(虽然我现在通常使用可以为空的简单类型,这个代码确实适用)。
答案 2 :(得分:0)
您需要做出的第一个决定是: T 可以是 int 之类的值类型吗? 如果是这样,你可以删除
where T: class
和
if (obj == null) return false;
else
如果 T 始终是引用类型,则可以删除
if (obj == null) return false;