8

したがって、私はアプリケーションで多くのデータベース作業を行っています-そして私のキャッシングシステムのいくつかの可能な戻り値があります。nullを返すか、デフォルト(type)を返すか、無効なオブジェクトを返すことができます(無効なオブジェクトとは、プロパティ/値が正しくないオブジェクトを意味します)。次のように、これらすべてのチェックを行う拡張メソッドを作成したいと思います。

    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))問題は、私のコンパイラが常にfalseになると言っていることです。

何故ですか?

4

3 に答える 3

21

「クラス」制約(where T: class)があるため、default(T)常にnullに等しくなります。元のifステートメントですでにチェックされているため、2番目のケース(obj == default(T))が真になることはありません。

于 2012-02-08T17:35:01.883 に答える
1

あなたがしたいのか、あなたがしなければならないと感じているので、あなたがそれをクラスに制限しているのかどうかはわかりません。後者の場合、複雑で単純な型でデフォルト値のチェックを行う方法は次のとおりです。

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

クラスのみに制限するという選択が意図的なものであるか、ビジネスケースである場合は、この提案を無視してください。これが説明できないもう1つのことは、単純型のボクシングです(ただし、最近は通常null許容型の単純型を使用していますが、このコードはこのコードで機能します)。

于 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 に答える