2011-09-11 146 views
0

之外我有以下情形:C#重載==操作符類

public class SomeClass { 
     // Have some other data members as well 
     public int i ; 
    } 

    public class TestClass { 

     public bool SomeFunction() { 
      SomeClass a = new SomeClass(); 
      SomeClass b = new SomeClass(); 
      if (a == b) // this is where I am getting compile error 
       return true; 
      return false; 
     } 

     public static bool operator==(SomeClass a, SomeClass b) { 
      if (a.i == b.i) 
       return true; 
      // compare some other members as well 
      return false; 
     } 
    } 

這是可能在C#中實現?

感謝您的幫助!

+0

爲什麼你想在課堂上做到這一點? –

+0

因爲在實際的代碼中,類在上面的例子「SomeClass」,是別人的,我想驗證它 – test123

回答

1

不,這不可能從沒有參與操作的類中重寫操作。


你可以讓一個類實現IEualityComparer<SomeClass>,它可以用來代替在某些情況下,比較標準的,例如在詞典:

var x = new Dictionary<SomeClass, string>(new SomeClassEqualityComparer()); 

如果你只是想在自己的班級中使用比較,你可以使其成爲常規的靜態方法,而不是覆蓋運營商:

public static bool SomeClassEqual(SomeClass a, SomeClass b) { 
    if (a.i == b.i) { 
    return true; 
    } 
    // compare some other members as well 
    return false; 
} 

用法:

if (SomeClassEqual(a, b)) 
+0

感謝您的回答。這就是我想知道的。所以我想我將不得不編寫愚蠢的函數來做比較。穿過它。 – test123

+1

我認爲你的意思是['IEqualityComparer '](http://msdn.microsoft.com/en-us/library/ms132151.aspx),而不是'IEquatable '。前者可用於比較特定類型的兩個對象,而後者用於比較特定類型的某個其他對象與實現「IEquatable 」的對象。換句話說,一個平等比較者不是平等檢驗的一方,而一個平等檢驗者是。 – cdhowie

+0

@cdhowie:是的,你是對的。 – Guffa

1

首先,您不能在void方法上使用return true;

其次,重寫操作符應該應用於宿主類。在你的情況下,在SomeClass而不是TestClass裏面。

第三,當您執行==覆蓋操作符時,還應該執行!=

這裏是你的代碼,修改和工作:

public class SomeClass 
{ 
    // Have some other data members as well 
    public int i; 

    public static bool operator ==(SomeClass a, SomeClass b) 
    { 
     if (a.i == b.i) 
      return true; 
     // compare some other members as well 
     return false; 
    } 

    public static bool operator !=(SomeClass a, SomeClass b) 
    { 
     return !(a == b); 
    } 
} 

public class TestClass 
{ 

    public bool SomeFunction() 
    { 
     SomeClass a = new SomeClass(); 
     SomeClass b = new SomeClass(); 
     if (a == b) // this is where I am getting compile error 
      return true; 

     return false; 
    } 
} 
+1

對不起,我的壞。這只是一個示例代碼。我會修好它。謝謝! – test123

+0

是的,這是我想確認是否有可能重寫主機類之外的運算符? – test123

+0

感謝您的更新代碼。其實我知道把這些方法放在實際的課堂裏是行得通的。我的問題實際上是,如果我嘗試在宿主類之外重寫它們,它是否可以工作。但我猜這是不可能的,因爲@Guffa回答。無論如何感謝您的回覆。 – test123