c#比较两个通用值
可能重复:c#比较两个通用值,c#,generics,C#,Generics,可能重复: 我编写了如下代码: public bool IsDataChanged() { T value1 = GetValue2; T value2 = GetValue1(); return (valueInDB != valueFromView); } 现在函数没有编译,错误“Operator”!=“不能应用于“t”和“t”类型的操作数。要使此功能正常工作,我必须做些什么?这应该适合您 public bool test<T>
我编写了如下代码:
public bool IsDataChanged()
{
T value1 = GetValue2;
T value2 = GetValue1();
return (valueInDB != valueFromView);
}
现在函数没有编译,错误“Operator”!=“不能应用于“t”和“t”类型的操作数。要使此功能正常工作,我必须做些什么?这应该适合您
public bool test<T>(T test, T test2) where T : class
{
return (test != test2);
}
公共bool测试(T测试,T测试2),其中T:class
{
返回(test!=test2);
}
这只是从对您的问题进行评论的示例粘贴而来。您可以在对象上重载.Equals()方法,并将计算更改为:
return (!valueInDB.Equals(valueFromView));
假设valueInDB和valueFromView是对象。您的示例变量与比较中使用的变量的名称不同,因此我不得不假设
编辑:被打败了3秒!关于重载的一个注意事项是,如果需要比较类型内的值,则对象类中的basic.Equals()将不够,因为它只会对复杂类型进行内存比较。您需要重载并提供您希望如何比较对象的实现。您的类型需要实现or接口
也许你需要重写一篇文章=b as!(a==b),或者显式调用CompareTo()或Equals()方法。除非添加where T:class以指示它是引用类型(那么foo==bar是合法的),否则不能在泛型类型上使用运算符(特殊情况下的foo==null除外) 使用
EqualityComparer
。默认为您执行此操作。这将不适用于仅为==提供运算符重载的类型,而不包括:
- 实施
IEquatable
- 重写object.Equals()
public bool IsDataChanged<T>()
{
T value1 = GetValue2;
T value2 = GetValue1();
return !EqualityComparer<T>.Default.Equals(value1 , value2);
}
public bool IsDataChanged()
{
T value1=GetValue2;
T value2=GetValue1();
return!EqualityComparer.Default.Equals(value1,value2);
}
如果不限制为
IEquatable
,则EqualityComparer默认回退在与值类型一起使用时可能会导致装箱,如果它们没有实现IEquatable
(如果您控制正在使用的类型,这可能无关紧要)。我假设您正在使用=!对于性能,尽管如此,限制为泛型类型将避免通过Object.Equals(Object)路由进行意外的装箱。Dup of,实际上,您不需要t:IEquatable限制-它在没有它的情况下工作,使用.EqualsRe运算符,你可以通过www.pobox.com/~skeet/csharp/missutil/usage/genericoperators.htmltanks获得操作符链接,但我觉得值得指出的是,你不能使用操作符,你必须通过某种方式来实现相同的行为。错误的是jyst非常好的环:)我指出了保留限制的原因,尽管你不必这样做。对不起,但推理是不正确的;约束是不必要的,也是一个负担。它对正确性是不必要的。你是对的,我将进行编辑以澄清这一点。即使接受的答案更完整,这个解决方案肯定是解决问题的最简单的解决方案。这只会Object.ReferenceEquals(test,test2)
。它不检查值是否相等。请小心null引用异常。