use*_*810 8 c# generics operators
我有泛型问题.当我尝试在通用中使用较少的运算符时,他们的调用不会发生.但它适用于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;
}
}
Run Code Online (Sandbox Code Playgroud)
和班级检查员:
public class Checker
{
public Boolean TestGeneric<T>(T Left, T Right) where T : class
{
return Left == Right; //not work override operators
return Left.Equals(Right); //work fine
}
}
Run Code Online (Sandbox Code Playgroud)
小测试:
Test left = new Test() { i = 4 };
Test right = new Test() { i = 4 };
var checker = new Checker();
Console.WriteLine(checker.TestGeneric<Test>(left, right));
Console.ReadKey();
Run Code Online (Sandbox Code Playgroud)
如何在通用的类Test中使用较少的运算符?
Tho*_*que 11
重载运算符是静态方法,因此它们不参与多态; 它们在编译时基于已知的操作数类型进行静态解析.
在泛型方法,编译器无法知道T将是Test(因为它实际上可能是别的),所以它使用的最普遍的定义==,这是参考比较.
请注意,如果您在通用方法上添加一个强制T要求的约束Test或它的子类Test,它将按预期工作,但当然它不再适用于其他类型...
| 归档时间: |
|
| 查看次数: |
119 次 |
| 最近记录: |