簡體   English   中英

C# generics class 操作員不工作

[英]C# generics class operators not working

我對泛型有疑問。 當我嘗試在泛型中使用 less 運算符時,他們的調用沒有發生。 但它適用於 Equals 方法。 那是一些測試 class:

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;
    }
}

和 class 檢查員:

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();

我如何在 class 通用測試中使用較少的運算符?

重載運算符是靜態方法,因此它們不參與多態; 它們在編譯時基於已知的操作數類型進行靜態解析。

在通用方法中,編譯器不能知道T將是Test (因為它實際上可能是其他任何東西),因此它使用==的最一般定義,即參考比較。

請注意,如果您對泛型方法添加約束迫使TTest或子類Test ,它會達到預期效果,但當然不會對其他類型的工作了......

這現在適用於 C# 11 / .NET 7(或以上):

public class Test : IEqualityOperators<Test, Test, bool>
{ /* no changes except ^^^ addition */ }

public bool TestGeneric<T>(T Left, T Right) where T : IEqualityOperators<T, T, bool>
{
    return Left == Right; // does what you expect
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM