如何比较T到T?

时间:2013-11-08 08:15:15

标签: c# generics comparison

我有一个泛型类,它包含一个值。此类存储一个默认值,我想检查存储的值是否等于默认值。

起初,我只是尝试过:

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

但遗憾的是(并且令人惊讶地)没有编译 - 编译器抱怨,它无法将T与T进行比较。第二种方法是:

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

它有效,但我的字符串有问题,因为我的情况下的空字符串等于空字符串,但前面的代码不包括它。

我可能会将字符串专门用于字符串,但如果没有必要,我会避免使用它。有没有办法以通用的方式比较两个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
        {
            // ?
        }
    }
}

1 个答案:

答案 0 :(得分:4)

您的类的构造函数应该使用IEqualityComparer<T>作为参数,并且重载可以传递到EqualityComparer<T>.Default。存储它并用于测试是否相等。如果是字符串,请传入IEqualityComparer<string> "" == 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);
            }
        }
    }
}