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方法对我们有帮助
试试看吧