8

所以,我在一个应用程序中做了大量的数据库工作——我的缓存系统有几个可能的返回值。它可以返回 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))将永远是错误的。

这是为什么?

4

3 回答 3

21

Since you have a "class" constraint (where T: class), default(T) is always equal to null. You already have a check for that in the original if statement, so the second case (obj == default(T)) could never be true.

于 2012-02-08T17:35:01.883 回答
1

我不确定您是否将其限制在课堂上是因为您想这样做还是因为您觉得必须这样做。如果是后者,这是一种对复杂和简单类型进行默认值检查的方法:

public static bool Valid<T> (this T obj)
{
    return !EqualityComparer<T>.Default.Equals(obj, default(T));
}

如果您选择仅将其限制为类是有意的或出于商业案例,请随意忽略此建议。这可能无法解释的另一件事是简单类型的装箱(尽管这些天我通常使用可为空的简单类型,这段代码确实适用)。

于 2012-03-26T19:23:29.967 回答
0

您需要做出的第一个决定是:T可以是像int这样的值类型吗?
如果是这样,您可以删除

 where T: class

if (obj == null) return false;
else 

如果T始终是引用类型,您可以删除

if (obj == null) return false;
于 2012-02-09T16:17:27.377 回答