c#比较两个通用值

可能重复:
不能运算符==应用于C#中的genericstypes?

我编写了这样的东西:

public bool IsDataChanged() { T value1 = GetValue2; T value2 = GetValue1(); return (valueInDB != valueFromView); } 

此时该函数不会编译错误“ Operator'!='不能应用于'T'和'T''types的操作数 。 为了使这个function有效,我需要做些什么?

除非你添加T:class来表示它是一个引用types(那么foo == bar是合法的),否则你不能在genericstypes上使用运算符(foo == null除外)

使用EqualityComparer<T> .Default来为你做。 这不会在仅为==提供运算符超载的types上工作,

  • 实现IEquatable<T>
  • 覆盖object.Equals()

一般来说,实现==操作符,而不是至less执行其中的一个将是一个非常糟糕的主意,所以这不可能是一个问题。

 public bool IsDataChanged<T>() { T value1 = GetValue2; T value2 = GetValue1(); return !EqualityComparer<T>.Default.Equals(value1 , value2); } 

如果不限制为IEquatable<T>那么EqualityComparer默认回退可能会导致与值types一起使用装箱,如果它们没有实现IEquatable<T> (如果您控制正在使用的types,这可能无关紧要)。 我假设你正在使用=! 性能尽pipe如此限制到通用types将通过Object.Equals(对象)路线避免意外拳击。

您的types需要实现IComparable或IEquatable接口。

可能你需要重写!= b as!(a == b),或者显式调用CompareTo()或Equals()方法。

这应该适合你。

 public bool test<T>(T test, T test2) where T : class { return (test != test2); } 

这只是从你的问题上评论的例子。

您可以重载对象的.Equals()方法,并将您的评估更改为:

 return (!valueInDB.Equals(valueFromView)); 

假设valueInDB和valueFromView是对象。 您的示例variables与比较中使用的variables名称不同,因此我必须假设。

编辑:有3秒的节拍! 关于重载的说明,如果您需要比较某个types中的值,那么Object类的基本.Equals()将不够用,因为它只会对复杂types进行内存比较。 你需要重载并提供你想要如何比较对象的实现。

Genric对于在.net中定义的其他types是一种genrelizedforms,所以copare值在generics1中。您需要实现IComparable或IEquatable接口。 1.使用.Equals(),CompareTo方法对我们有帮助

试试看吧