10

可能重复:
不能将运算符 == 应用于 C# 中的泛型类型吗?

我有以下泛型类,编译器抱怨“ Operator '!=' cannot be applied to operands of type 'TValue' and 'TValue'”(参见CS0019):

public class Example<TValue>
{
    private TValue _value;
    public TValue Value
    {
        get { return _value; }
        set
        {
            if (_value != value) // <<-- ERROR
            {
                _value= value;
                OnPropertyChanged("Value");
            }
        }
    }
}

如果我限制TValueclass,我可以使用Object.Equals(). 由于我对结构和类都需要这个,但如果我能避免这种情况,我会很高兴。

所以问题是,我如何比较两个相同但不受约束的泛型类型的元素是否相等?

4

6 回答 6

15

你尝试过这样的事情吗?

public class Example<TValue>
{
    private TValue _value;
    public TValue Value
    {
        get { return _value; }
        set
        {

            if (!object.Equals(_value, value))
            {
                _value = value;
                OnPropertyChanged("Value");
            }
        }
    }
}
于 2008-12-03T12:02:00.313 回答
7

三个选项:

  • 约束 TValue 实现IEquatable<TValue>,然后调用x.Equals(y)
  • 取另一个类型的参数IEqualityComparer<TValue>并使用它
  • 用于EqualityComparer<TValue>.Default执行比较

当然,您总是可以混合和匹配选项 2 和 3 - 默认为默认比较器,但也允许提供特定的比较器。

于 2008-12-03T12:47:40.003 回答
2
  • 值类型的 Equals()
  • ReferenceEquals() 用于引用类型
于 2008-12-03T11:48:26.330 回答
1

IComparable 是一种选择吗?

public class Example<TValue> where TValue: IComparable
{
    private TValue _value;
    public TValue Value
    {
        get { return _value; }
        set
        {

            if (_value.CompareTo(value) != 0)
            {
                _value = value;
                OnPropertyChanged("Value");
            }
        }
    }
}
于 2008-12-03T12:39:28.897 回答
0

我认为!=运算符不能在这里应用,因为在某些情况下它不能使用。例如,!=不能用于比较结构,除非比较运算符 ( == !=) 被重载。

当然,您可以比较语言结构,例如int != int,但我不确定这是如何实现的。

所以,因为 TValue 可以是自定义结构,所以它不能使用!=操作符。

于 2008-12-03T12:39:28.757 回答
0
public static bool operator ==(EntityBase<T> entity1, EntityBase<T> entity2)
        {
            if ((object)entity1 == null && (object)entity2 == null)
            {
                return true;
            }

            if ((object)entity1 == null || (object)entity2 == null)
            {
                return false;
            }

            if (Comparer<T>.Default.Compare(entity1.Id, entity2.Id) != 0)
            {
                return false;
            }

            return true;
        }
于 2011-07-14T10:17:20.043 回答