2013-12-17 93 views
4

如何爲我的類的實例定義運算符==?我想是這樣的:如何覆蓋==運算符

public bool operator == (Vector anotherVector) 
{ 
    return this.CompareTo(anotherVector) == 1 ;    
} 

但它說:

重載一元算料

+0

運算符必須是靜態的。 – Jeremy

回答

9

您需要標記方法static,你也必須執行不等於!=

public static bool operator ==(Vector currentVector,Vector anotherVector) 
{ 
    return currentVector.CompareTo(anotherVector) == 1 ;    
} 

您必須爲兩個對象實施==

!=

public static bool operator !=(Vector currentVector,Vector anotherVector) 
{ 
    return !(currentVector.CompareTo(anotherVector) == 1) ; 
} 

參見:Guidelines for Overloading Equals() and Operator == (C# Programming Guide)

重載==操作符的實現不應該拋出異常。 任何重載operator ==的類型都應該重載operator!=。

+3

'靜態'函數不能使用'this'。 –

+0

問題中的「this」當然是爲了表示左邊的操作數。 –

+0

@BenVoigt,我很滿意downvote和值得在這一個失蹤'這個'。但是我更關心'static'並執行'!=' – Habib

3

與C++,這允許使得左操作數成爲this指針操作員被定義爲實例成員函數,C#運算符重載總是作爲靜態成員函數來完成。

指針不能有this,兩個操作數都是顯式參數。

public static bool operator==(Vector left, Vector right) 
{ 
    return left.CompareTo(right) == 1;    
} 

(雖然這看起來語義上不正確,通常CompareTo返回零爲等值)

+0

然後我怎麼稱之爲比較? – user2128702

+0

@ user2128702:這部分就像C++一樣。如果你有兩個向量'a'和'b',寫'if(a == b)'或'bool same =(a == b);' –

+2

+1「語義上不正確。是啊。雖然認爲它應該重寫'Equals(Vector)',並以此來實現'=='。這是'回到左邊。等(右)'。 –

2

我Habib的回答完全同意 - 也+1 ...只是不要忘了處理空值。

public static bool operator ==(Vector left, Vector right) 
     { 
      if ((object)left == null) 
       return (object)left == null; 

      if ((object)right == null) 
       return false; 

      return ...; 
     } 

太大,不能發表他的評論。希望這可以幫助。