运算符=不能应用于C#中的泛型类型吗?根据文件==运算符MSDN,对于预定义的值类型,如果操作数的值相等,则相等运算符(=)返回true,否则为false。对于字符串以外的引用类型,如果其两个操作数引用同一个对象,则=返回true。对于字符串类型,=比较字符串的值。用户定义的值类型可以重载=操作符(请参阅操作符)。用户定义的引用类型也可以,尽管默认情况下,对于预定义和用户定义的引用类型,其行为都如上文所述。那么,为什么这个代码段无法编译呢?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); } }
3 回答
largeQ
TA贡献2039条经验 获得超7个赞
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; }
侃侃无极
TA贡献2051条经验 获得超10个赞
IComparer<T>
EqualityComparer<T>.Default
public bool Compare<T>(T x, T y){ return EqualityComparer<T>.Default.Equals(x, y);}
- 3 回答
- 0 关注
- 812 浏览
添加回答
举报
0/150
提交
取消