【问题标题】:C# generics class operators not workingC#泛型类运算符不起作用
【发布时间】:2014-02-06 13:10:05
【问题描述】:

我对泛型有疑问。当我尝试在通用中使用较少的运算符时,他们的调用没有发生。但它适用于 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 中使用更少的运算符?

【问题讨论】:

  • 除非您知道自己在做什么,否则请不要覆盖 equals。即使这样,也要三思而后行!
  • return 5; 不是最大的哈希码。
  • 是的。您应该改用 666。
  • @Jodrell 为什么?在任何可能的 1 项中都没有冲突。

标签: c# generics operators


【解决方案1】:

重载的操作符是静态方法,所以不参与多态;它们在编译时根据已知的操作数类型静态解析。

在泛型方法中,编译器无法知道T 将是Test(因为它实际上可能是其他任何东西),因此它使用== 的最一般定义,即引用比较。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-19
    • 2016-06-10
    • 1970-01-01
    • 2014-08-06
    • 2018-09-24
    相关资源
    最近更新 更多