如何比较T和T?

3
我有一个通用类,其中包含一个值。该类存储一个默认值,我想检查存储的值是否等于默认值。
起初,我尝试了以下方式:
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
        {
            // ?
        }
    }
}

请展示声明,即在使用泛型类型参数的地方进行声明。 - Rune FS
1个回答

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);
            }
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接