可能的重复:
运算符 == 不能应用于 C# 中的泛型类型吗?
我编写了这样的代码:
public bool IsDataChanged()
{
T value1 = GetValue2;
T value2 = GetValue1();
return (valueInDB != valueFromView);
}
现在该函数无法编译并出现错误“运算符“!=”不能应用于“T”和“T”类型的操作数”。我需要做什么才能让这个功能发挥作用?
您不能在泛型类型上使用运算符(除了 foo == null ,这是一种特殊情况),除非您添加 where T : class 来指示它是引用类型(然后 foo == bar 是合法的)
Use EqualityComparer<T>
.默认为你做。这会not适用于仅为 == 提供运算符重载的类型,同时不提供以下任一操作符:
- 实施
IEquatable<T>
- 覆盖 object.Equals()
一般来说,实现 == 运算符而不同时执行其中至少一项将是一个非常糟糕的主意,因此这不太可能成为问题。
public bool IsDataChanged<T>()
{
T value1 = GetValue2;
T value2 = GetValue1();
return !EqualityComparer<T>.Default.Equals(value1 , value2);
}
如果你不限制IEquatable<T>
那么,如果 EqualityComparer 未实现,则在与值类型一起使用时,EqualityComparer 默认回退可能会导致装箱IEquatable<T>
(如果您控制正在使用的类型,这可能并不重要)。我假设您使用的是=!但为了性能,限制通用类型将避免偶然通过 Object.Equals(object) 路线进行装箱。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)