可能的重复:
运算符 == 不能应用于 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(). 。由于我的结构和类都需要这个,如果我能避免这种情况,我会很高兴。

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

有帮助吗?

解决方案

您是否尝试过这样的事?

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

            if (!object.Equals(_value, value))
            {
                _value = value;
                OnPropertyChanged("Value");
            }
        }
    }
}

其他提示

三个选项:

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

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

  • 值类型的 equals()
  • ReferenceEquals() 用于引用类型

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

我觉得!=操作者可以因为有它无法使用的情况下不应用在这里。例如,!=不能用于比较结构中,除比较运算符(== !=)的过载。

当然,你可以比较的语言结构,像int != int,但我不知道这是如何实现的。

所以,因为TValue可以是定制结构,它不能使用!=运算符。

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;
        }
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top