C# 空检查扩展方法

C# 空检查扩展方法,c#,linq,resharper,null-check,C#,Linq,Resharper,Null Check,因此,我在一个应用程序中做了大量的数据库工作——我的缓存系统有几个可能的返回值。它可以返回null,可以返回默认值(类型),也可以返回无效对象(无效对象,我指的是属性/值不正确的对象)。我想创建一个扩展方法来为我进行所有这些检查,如下所示: public static bool Valid<T> (this T obj) where T: class { if (obj == null) return false;

因此,我在一个应用程序中做了大量的数据库工作——我的缓存系统有几个可能的返回值。它可以返回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;
    }
公共静态bool有效(此T对象),其中T:class
{
if(obj==null)
返回false;
else if(obj==默认值(T))
返回false;
//这里还有其他的班级检查
其他的
返回true;
}
问题是,我的编译器告诉我,
if(obj==default(T))
将始终为false


为什么会这样?

因为您有一个“类”约束(
其中T:class
),所以
默认值(T)
总是等于null。您已经在原始if语句中对此进行了检查,因此第二种情况(
obj==default(T)
)永远不可能是真的。

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

 where T: class

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

if (obj == null) return false;

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

public static bool Valid<T> (this T obj)
{
    return !EqualityComparer<T>.Default.Equals(obj, default(T));
}
公共静态bool有效(此目标)
{
return!EqualityComparer.Default.Equals(obj,Default(T));
}

如果您选择仅将其限制在类中是有意的,或者是为了一个商业案例,请忽略此建议。另一个可能没有解释的问题是简单类型的装箱(尽管我现在通常使用可空的简单类型,这段代码确实适用于此)。

它是否会给您一个编译器错误或警告。我两个都没有。它编译得很好。@GregB。可能是
resharper
给了他一个提示…@GregB是的,我有resharper@caesay-我不明白这个问题。类引用的默认值为null。对象引用的默认值也将为null。听起来你好像不明白自己代码的语法。@Ramhound:我承认,这完全是我的误解。
public static bool Valid<T> (this T obj)
{
    return !EqualityComparer<T>.Default.Equals(obj, default(T));
}