【问题标题】:How to compare T to T?如何比较 T 和 T?
【发布时间】:2013-11-20 04:28:05
【问题描述】:

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

起初,我只是简单地尝试了:

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?


编辑:响应cmets

假设该类如下所示:

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
        {
            // ?
        }
    }
}

【问题讨论】:

  • 请同时显示声明,即您使用泛型类型参数的声明

标签: c# generics comparison


【解决方案1】:

您的类的构造函数应该将IEqualityComparer&lt;T&gt; 作为参数,而重载可以传入EqualityComparer&lt;T&gt;.Default。存储它并用于测试是否相等。对于字符串,传入一个考虑"" == nullIEqualityComparer&lt;string&gt;

像这样:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-25
    相关资源
    最近更新 更多