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引用异常。