gpt4 book ai didi

C# 泛型类运算符不工作

转载 作者:太空狗 更新时间:2023-10-29 18:25:04 24 4
gpt4 key购买 nike

我对泛型有疑问。当我尝试在泛型中使用 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(因为它实际上可能是其他任何东西),因此它使用最通用的定义==的,也就是引用比较。

请注意,如果您在泛型方法上添加约束以强制TTestTest 的子类,它将起作用正如预期的那样,但当然它不再适用于其他类型......

关于C# 泛型类运算符不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21181921/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com