根据MSDN中==
操作符的文档,
对于预定义的值类型 相等运算符(==)返回true 其操作数的值相等, 否则错误。对于参考类型 除了字符串,==返回true如果 它的两个操作数指向同一个对象 对象。对于字符串类型,== 比较字符串的值。 用户定义的值类型可能重载 ==运算符(参见operator)。所以可以 用户定义的引用类型 by default ==行为如所述 以上为预定义的和 用户自定义的引用类型
那么为什么这个代码片段编译失败呢?
bool 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); } }