3

値を含むジェネリック クラスがあります。このクラスにはデフォルト値が保存されており、保存された値がデフォルト値と等しいかどうかを確認したいと思います。

最初に、私は簡単に試しました:

public bool IsDefault
{
    get
    {
        return value == defaultValue;
    }
}

しかし、残念なことに (そして驚くべきことに)、それはコンパイルされません。コンパイラは、T と T を比較できないと文句を言います。2 番目のアプローチは次のとおりです。

public bool IsDefault
{
    get
    {
        if (value == null)
            return defaultValue == null;
        else
            return value.Equals(defaultValue);
    }
}

動作しますが、文字列に問題があります。私の場合、null 文字列は空の文字列に等しいためですが、前のコードではそれがカバーされていません。

クラスを文字列に特化することもできますが、必要がない場合は避けます。2 つの T を一般的な方法で比較する方法はありますか?


編集:コメントに応じて

クラスが次のようになっていると仮定しましょう。

public class MyClass<T>
{
    private T value;
    private T defaultValue;

    public MyClass(T newDefault)
    {
        value = newDefault;
        defaultValue = newDefault;
    }

    public T Value
    {
        get
        {
            return value;
        }
        set
        {
            this.value = value;
        }
    }

    public bool IsDefault
    {
        get
        {
            // ?
        }
    }
}
4

1 に答える 1

4

クラスのコンストラクターはIEqualityComparer<T>パラメーターとして を受け取る必要があり、オーバーロードはEqualityComparer<T>.Default. それを保存し、等しいかどうかをテストするために使用します。文字列の場合は、IEqualityComparer<string>を考慮した an を渡し"" == nullます。

このような:

class Example<T>
{
    private readonly IEqualityComparer<T> comparer;
    private readonly T defaultValue;
    private T value;

    public Example(T value, T defaultValue, IEqualityComparer<T> comparer)
    {
        this.value = value;
        this.defaultValue = defaultValue;
        this.comparer = comparer;
    }

    public Example(T value, T defaultValue)
        : this(value, defaultValue, EqualityComparer<T>.Default)
    {
    }

    public Example(T value)
        : this(value, default(T))
    {
    }

    public Example()
        : this (default(T))
    {
    }

    public bool IsDefault
    {
        get
        {
            if (value == null)
            {
                return defaultValue == null;
            }
            else
            {
                return comparer.Equals(value, defaultValue);
            }
        }
    }
}
于 2013-11-08T08:24:01.443 に答える