代码之家  ›  专栏  ›  技术社区  ›  David Schmitt

如何比较相同但不受约束的泛型类型的两个元素以获得相等性?[复制品]

  •  8
  • David Schmitt  · 技术社区  · 16 年前

    可能重复:
    Can’t operator == be applied to generic types in 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");
                }
            }
        }
    }
    

    如果我约束 TValue class 我可以用 Object.Equals() . 因为我需要这两个结构和类,如果我可以避免的话我会非常高兴。

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

    6 回复  |  直到 16 年前
        1
  •  12
  •   Sergiu Damian    16 年前

    你试过这样的东西吗?

    public class Example<TValue>
    {
        private TValue _value;
        public TValue Value
        {
            get { return _value; }
            set
            {
    
                if (!object.Equals(_value, value))
                {
                    _value = value;
                    OnPropertyChanged("Value");
                }
            }
        }
    }
    
        2
  •  7
  •   Jon Skeet    16 年前

    三种选择:

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

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

        3
  •  2
  •   leppie    16 年前
    • 值类型的equals()。
    • 引用类型的referenceEquals()。
        4
  •  1
  •   liggett78    16 年前

    是否可比较?

    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");
                }
            }
        }
    }
    
        5
  •  0
  •   bruno conde    16 年前

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

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

    所以,因为tValue可以是 习俗 结构,它不能使用 != 操作员。

        6
  •  0
  •   lkurylo    13 年前
    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;
            }