按照==
操作者在MSDN文档,不能将运算符==应用于C#中的泛型类型吗?
对于预定义的值的类型,如果 的操作数的值相等的 等号(==)返回true, 否则返回false。对于字符串以外的参考类型 ,==返回true,如果 其两个操作数指向相同的 对象。对于字符串类型,== 比较字符串的值。 用户定义的值类型可能会过载 ==运算符(请参阅运算符)。所以 用户定义的参考类型,尽管默认情况下为 ==对于两个预定义参数类型和 用户定义的参考类型的行为如上所述 。
那么为什么这段代码片段无法编译?
void Compare<T>(T x, T y) { return x == y; }
我得到的错误操作“==”不能应用于类型的操作数“T”和“T”。我想知道为什么,因为据我所知==
运算符是为所有类型预定义的?
编辑:谢谢大家。起初我没有注意到这个陈述只是关于参考类型。我还认为所有值类型都提供了逐位比较,我现在知道的是而不是正确。
但是,如果我使用的是引用类型,那么==
运算符是否会使用预定义的引用比较,或者如果类型定义了运算符,它会使用运算符的重载版本吗?
编辑2:通过反复试验,我们了解到==
运算符在使用不受限制的泛型类型时将使用预定义的引用比较。实际上,编译器会使用它可以找到的限制类型参数的最佳方法,但不会再看到。例如,下面的代码将始终打印true
,即使Test.test<B>(new B(), new B())
叫做:
class A { public static bool operator==(A x, A y) { return true; } }
class B : A { public static bool operator==(B x, B y) { return false; } }
class Test { void test<T>(T a, T b) where T : A { Console.WriteLine(a == b); } }
见我的答案回答你的后续问题。 – 2008-12-24 12:48:03
理解即使没有泛型,在同一类型的两个操作数之间不允许使用'=='也有一些类型。这对于`struct ==`不会超载的`struct`类型(除了“预定义”类型)是正确的。作为一个简单的例子,试试这个:var map = typeof(string).GetInterfaceMap(typeof(ICloneable)); Console.WriteLine(map == map);/*编译时错误* /` – 2013-08-19 08:54:52
继续我自己的旧评论。例如(见[其他线程](https://stackoverflow.com/questions/6379915/)),`var kvp1 = new KeyValuePair(); var kvp2 = kvp1;`,那么你不能检查`kvp1 == kvp2`,因为`KeyValuePair <,>`是一个结构体,它不是C#预定义的类型,并且它不会重载'operator ==`。然而,一个例子是`var li = new List (); var e1 = li.GetEnumerator(); var e2 = e1;``不能用'e1 == e2`(这里我们有嵌套结构体`List <>。Enumerator`(称为```List`1 + Enumerator [T]“``由运行时)不会超载`==`)。 –
2017-06-18 14:45:05