2017-01-30 86 views
8

我有一個struct調用MyType,實現IEquatable<MyType>我應該重寫==對象和MyType嗎?

我實施了operator ==(MyType x, MyType y),但是我是否還應該在下面的情況下執行operator ==(MyType x, object y)

例如:

public static bool operator ==(MyType x, object y) 
{ 
    if (y is MyType) 
    { 
     return x == (MyType)y; 
    } 

    return false; 
} 

用法:

var a = new MyType(); 
object b = new MyType(); 

var result = (a == b); // ? 
+0

你可以添加一個如何使用這個操作符的例子嗎? – HimBromBeere

+0

@HimBromBeere新增 – sdgfsdh

+2

@HimBromBeere - wouldnt一個'as' cast從不返回'null',因爲它的'struct'? – Igor

回答

1

沒有CTS類型做到這一點,據我所知。好例子包括十進制日期時間,它們只爲它們各自的類型實現相等性,而不是它們的基類型或接口。

而且,這種實現可能會鼓勵比較幾乎任何類型與結構,甚至是其他結構,和別人誰可能會使用你的代碼在未來可能會覺得比較的MyTypeMyOtherType可能是有意義的,而所有它會做拳擊的另一種類型,然後返回false。此外,人們通常將object上的==解釋爲意指參考平等。

此外,你應該重載op_Equalityop_Inequality運營商。這可以確保所有的相等測試都能返回一致的結果。

documentation不知道哪個運營商的平等,你應該過載,而第二句話實際上可能MyType == object是與MyType.Equals(object)一致的條款進行解釋。然而,事實上,沒有.NET類型實際上這樣做,並導致混淆,這足以說明這不是一個好習慣。

如果其他類型可以視爲MyType,則重載顯式或隱式轉換。

相關問題