2014-01-17 65 views
8

我有一個泛型的問題。當我嘗試在通用中使用較少的運算符時,它們的調用不會發生。但它適用於Equals方法。 這是一些測試類:C#泛型類運算符不工作

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

我如何可以使用測試類運營商少仿製藥?

+2

請不要超越平等,除非你知道你在做什麼。即使那樣,請三思! –

+1

'return 5;'不是最大的哈希碼。 – Jodrell

+0

是的。您應該使用666。 –

回答

11

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

在泛型方法,編譯器無法知道TTest(因爲它實際上可能是別的),所以它使用的==最普遍的定義,這是參考比較。

請注意,如果您對泛型方法添加約束迫使TTestTest一個子類,它會如預期,但當然不會對其他類型的工作了......