“ …默认情况下,==对于预定义和用户定义的引用类型,其行为均如上所述。”
类型T不一定是引用类型,因此编译器无法做出该假设。
但是,这将编译,因为它更加明确:
bool Compare<T>(T x, T y) where T : class { return x == y; }跟进另一个问题,“但是,如果我使用的是引用类型,==运算符会使用预定义的引用比较,还是如果一个类型定义了一个,则它会使用运算符的重载版本吗?”
我本以为泛型中的==会使用重载版本,但以下测试则相反。有趣的是…我很想知道为什么!如果有人知道,请分享。
namespace TestProject{ class Program { static void Main(string[] args) { Test a = new Test(); Test b = new Test(); Console.WriteLine("Inline:"); bool x = a == b; Console.WriteLine("Generic:"); Compare<Test>(a, b); } static bool Compare<T>(T x, T y) where T : class { return x == y; } } class Test { public static bool operator ==(Test a, Test b) { Console.WriteLine("Overloaded == called"); return a.Equals(b); } public static bool operator !=(Test a, Test b) { Console.WriteLine("Overloaded != called"); return a.Equals(b); } }}输出量
内联:重载==已调用
通用:
按任意键继续 。。。
跟进2
我确实要指出,将我的比较方法更改为
static bool Compare<T>(T x, T y) where T : Test { return x == y; }导致重载的==运算符被调用。我想如果不指定类型(如 where
),编译器就无法推断它应该使用重载运算符…尽管我认为即使不指定类型,编译器也将具有足够的信息来做出该决定。



