c#比较两个通用值
c#比较两个通用值
This question already has answers here:
可能是重复问题:
我编写了如下代码:
public bool IsDataChanged() { T value1 = GetValue2; T value2 = GetValue1(); return (valueInDB != valueFromView); }
现在,该函数无法编译,并显示错误信息“运算符\'!=\'不能应用于类型为\'T\'和\'T\'的操作数”。我需要做什么来使该函数正常工作?
admin 更改状态以发布 2023年5月22日
对于泛型类型,您不能使用运算符(除了特殊情况下的foo == null),除非您添加where T:class以指示它是引用类型(然后foo == bar才合法)。
使用EqualityComparer
.Default可以帮助你完成这个操作。此方法无法处理仅为==提供运算符重载,而没有实现IEquatable
或重写object.Equals()
的类型
- 实现
IEquatable
- 重写
object.Equals()
通常情况下,仅实现==运算符而不做其中至少一项将是一种非常糟糕的想法,因此这不太可能成为一个问题。
public bool IsDataChanged() { T value1 = GetValue2; T value2 = GetValue1(); return !EqualityComparer .Default.Equals(value1 , value2); }
如果您不限制为IEquatable
,那么即使您控制使用的类型,当使用值类型时,EqualityComparer默认回退也可能会引起装箱(如果您控制使用的类型,则可能不重要)。我假设您是出于性能的考虑使用=!,因此限制为泛型类型将避免通过Object.Equals(object)路线的意外装箱问题。