C#generics类操作符不起作用

我有generics问题。 当我尝试在通用中使用较少的运算符时,他们的调用不会发生。 但它适用于Equals方法。 这是一个测试类:

public class Test { public int i; static public Boolean operator ==(Test obj1, Test obj2) { Console.WriteLine("operator =="); return obj1.i == obj2.i; } static public Boolean operator !=(Test obj1, Test obj2) { Console.WriteLine("operator !="); return obj1.i != obj2.i; } public override bool Equals(object obj) { Console.WriteLine("operator equals"); return this == (Test)obj; } public override int GetHashCode() { Console.WriteLine("HashCode"); return 5; } } 

和class级检查员:

 public class Checker { public Boolean TestGeneric(T Left, T Right) where T : class { return Left == Right; //not work override operators return Left.Equals(Right); //work fine } } 

小测试:

 Test left = new Test() { i = 4 }; Test right = new Test() { i = 4 }; var checker = new Checker(); Console.WriteLine(checker.TestGeneric(left, right)); Console.ReadKey(); 

如何在通用的类Test中使用较少的运算符?

重载运算符是静态方法,因此它们不参与多态; 它们在编译时静态解析,基于操作数的已知类型。

在通用方法中,编译器不能知道T将是Test (因为它实际上可能是其他任何东西),因此它使用==的最一般定义,即参考比较。

请注意,如果在generics方法上添加约束以强制TTestTest的子类,它将按预期工作,但当然它不再适用于其他类型…