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

Dav*_*itt 8 c# generics struct class equals

可能重复:
不能将运算符==应用于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");
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我限制TValueclass,我可以使用Object.Equals().既然我需要这个结构和类,我会很高兴,如果我可以避免这一点.

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

Ser*_*ian 12

你尝试过这样的事吗?

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

            if (!object.Equals(_value, value))
            {
                _value = value;
                OnPropertyChanged("Value");
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这将导致值类型的拳击惩罚. (4认同)

Jon*_*eet 7

三种选择:

  • 限制TValue实现IEquatable<TValue>然后调用x.Equals(y)
  • 取另一个类型参数IEqualityComparer<TValue>并使用它
  • 使用EqualityComparer<TValue>.Default进行比较

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