[英]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
(因為它實際上可能是其他任何東西),因此它使用==
的最一般定義,即參考比較。
請注意,如果您對泛型方法添加約束迫使T
是Test
或子類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.