c#比较两个通用值

15 浏览
0 Comments

c#比较两个通用值

This question already has answers here:

可能是重复问题:

C#中泛型类型无法使用“==”操作符?

我编写了如下代码:

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

现在,该函数无法编译,并显示错误信息“运算符\'!=\'不能应用于类型为\'T\'和\'T\'的操作数”。我需要做什么来使该函数正常工作?

admin 更改状态以发布 2023年5月22日
0
0 Comments

那对你来说应该是可以的。

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

这只是从你的问题的评论中粘贴的示例。

0
0 Comments

对于泛型类型,您不能使用运算符(除了特殊情况下的foo == null),除非您添加where T:class以指示它是引用类型(然后foo == bar才合法)。

使用EqualityComparer.Default可以帮助你完成这个操作。此方法无法处理仅为==提供运算符重载,而没有实现IEquatable或重写object.Equals()的类型

  • 实现IEquatable
  • 重写object.Equals()

通常情况下,仅实现==运算符而不做其中至少一项将是一种非常糟糕的想法,因此这不太可能成为一个问题。

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

如果您不限制为IEquatable,那么即使您控制使用的类型,当使用值类型时,EqualityComparer默认回退也可能会引起装箱(如果您控制使用的类型,则可能不重要)。我假设您是出于性能的考虑使用=!,因此限制为泛型类型将避免通过Object.Equals(object)路线的意外装箱问题。

0