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方法上添加约束以强制T
为Test
或Test
的子类,它将按预期工作,但当然它不再适用于其他类型…