可能重复:
不能将运算符==应用于C#中的泛型类型?
我编写了这样的代码:
public bool IsDataChanged()
{
T value1 = GetValue2;
T value2 = GetValue1();
return (valueInDB != valueFromView);
}
Run Code Online (Sandbox Code Playgroud)
现在该函数没有编译错误" 运算符'!='不能应用于'T'和'T'类型的操作数 ".我该怎么做才能使这个功能起作用?
我正在阅读源代码,EqualityComparer<T>.Default发现它并不那么聪明.这是一个例子:
enum MyEnum : int { A, B }
EqualityComparer<MyEnum>.Default.Equals(MyEnum.A, MyEnum.B)
//is as fast as
EqualityComparer<int>.Default.Equals(0, 1)
enum AnotherEnum : long { A = 1L, B = 2L }
//is 8x slower than
EqualityComparer<long>.Default.Equals(1L, 2L)
Run Code Online (Sandbox Code Playgroud)
原因很明显来自EqualityComparer中私有方法的源代码.
private static EqualityComparer<T> CreateComparer()
{
//non-important codes are ignored
if (c.IsEnum && (Enum.GetUnderlyingType(c) == typeof(int)))
{
return (EqualityComparer<T>) RuntimeTypeHandle.CreateInstanceForAnotherGenericParameter((RuntimeType) typeof(EnumEqualityComparer<int>), c);
}
return new ObjectEqualityComparer<T>();
}
Run Code Online (Sandbox Code Playgroud)
我们可以看到EqualityComparer<int>.Default,EqualityComparer<MyEnum>.Default并EqualityComparer<long>.Default得到一个明智的比较器,其Equals方法如下:
public static bool Equals(int x, int y) …Run Code Online (Sandbox Code Playgroud) 我已经阅读了以下关于C#在深度,第二版中多次比较C#值类型的声明.
第77页,
当类型参数不受约束时(不对其应用约束),您可以使用==和!=运算符,但仅用于将该类型的值与null进行比较.您无法将T类型的两个值相互比较.
...
当类型参数被约束为值类型时,==和!=根本不能与它一起使用.
如果我理解(我不这么认为)它是正确的,它基本上告诉我你不能使用==或!=来比较两种值类型.为什么为什么?
如果能够为这种情况提供一个简单的例子会更好.有人能给我一点想法,上面的段落试图传达什么?