2016-10-04 26 views
4

我最近遇到了列表中元組的一些令人驚訝的行爲。看起來,列表中的Contains與我所期望的做了不同的比較。請有人能解釋一下這個區別嗎?C#元組平等vs列表中包含

Tuple<int,int> A = new Tuple<int, int>(5,5); 
Tuple<int, int> B = new Tuple<int, int>(5, 5); 
List<Tuple<int,int>> AList = new List<Tuple<int, int>>() {A}; 

bool C = AList.Contains(B); // returns true 
bool D = A == B; // returns false 

編輯1:解決複製標誌。我意識到==和.Equals是不同的函數,這裏令人驚訝的是List.Contains函數中的特定實現。

+1

列表被調用'.Equals()'爲使得很多的比較,而不是''== – Rob

回答

1

A == B比較引用,因爲它們指向兩個不同的對象,所以結果是錯誤的。我認爲這已經很熟悉了。

bool C = AList.Contains(B);將調用.Equal檢查是否相等,從而返回true。

的差是一樣的A == B對A.Equals(B)

1

Contains使用來自object

==測試例如平等繼承了Equals方法(即,它們是引用到完全相同的實例)。

因此,我們可以說summise必須Tuple覆蓋Equals並返回true,如果每個元素的匹配,而==必須檢查左側和右側的情況是一樣的。

+0

感謝,澄清 – user230910

2

元組引用類型來實現,更多信息請read here

基準是,對於參考類型==執行標識比較,因此僅當兩個參考都指向同一個對象時結果纔會爲真。

Equals方法執行值比較,如果引用指向等效的對象,它將返回true。

相關問題