C#泛型类操作符不起作用

时间:2014-01-17 09:13:41

标签: 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;
    }
}

班级检查员:

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中使用较少的运算符?

1 个答案:

答案 0 :(得分:11)

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

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

请注意,如果您在通用方法上添加约束以强制==TTest的子类,它将按预期工作,但当然它赢了&# 39;为其他类型工作了......