作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我对泛型有疑问。当我尝试在泛型中使用 less 运算符时,他们的调用没有发生。但它适用于 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;
}
}
和类检查器:
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
}
}
小测试:
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();
如何在泛型的类 Test 中使用 less 运算符?
最佳答案
重载运算符是静态方法,所以不参与多态;它们在编译时根据已知的操作数类型静态解析。
在泛型方法中,编译器无法知道 T
将是 Test
(因为它实际上可能是其他任何东西),因此它使用最通用的定义==
的,也就是引用比较。
请注意,如果您在泛型方法上添加约束以强制T
为Test
或Test
的子类,它将起作用正如预期的那样,但当然它不再适用于其他类型......
关于C# 泛型类运算符不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21181921/
我是一名优秀的程序员,十分优秀!