你不能在泛型类型上使用运算符(除了foo == null,这是特殊的),除非你添加T:class来表示它是一个引用类型(然后foo == bar是合法的)
使用EqualityComparer
.Default为您完成.这不适用于仅为==提供运算符重载的类型,而且也不会:
实行 IEquatable
覆盖object.Equals()
一般来说,实现==运算符而不是至少执行其中一个操作也是一个非常糟糕的主意,所以这不是一个问题.
public bool IsDataChanged() { T value1 = GetValue2; T value2 = GetValue1(); return !EqualityComparer .Default.Equals(value1 , value2); }
如果你不限制IEquatable
那么EqualityComparer默认回退可能会导致装箱与值类型一起使用时如果它们没有实现IEquatable
(如果你控制正在使用的类型,这可能无关紧要).我假设你正在使用=!虽然如此限制Generic类型将避免通过Object.Equals(对象)路由意外装箱.
你不能在泛型类型上使用运算符(除了foo == null,这是特殊的),除非你添加T:class来表示它是一个引用类型(然后foo == bar是合法的)
使用EqualityComparer
.Default为您完成.这不适用于仅为==提供运算符重载的类型,而且也不会:
实行 IEquatable
覆盖object.Equals()
一般来说,实现==运算符而不是至少执行其中一个操作也是一个非常糟糕的主意,所以这不是一个问题.
public bool IsDataChanged() { T value1 = GetValue2; T value2 = GetValue1(); return !EqualityComparer .Default.Equals(value1 , value2); }
如果你不限制IEquatable
那么EqualityComparer默认回退可能会导致装箱与值类型一起使用时如果它们没有实现IEquatable
(如果你控制正在使用的类型,这可能无关紧要).我假设你正在使用=!虽然如此限制Generic类型将避免通过Object.Equals(对象)路由意外装箱.