public static IEnumerable<T> Method<T>(IEnumerable<T> iterable){
T previous = default(T);
foreach(T current in iterable){
if (!current.Equals(previous)){
previous = current;
yield return current;
}
}
}
我對此代碼沒有任何疑問,但如果可以使用以下方法比較兩個型別 T 的物件,我只是為什么:
if (!current.Equals(previous))
那么為什么無法使用以下方法進行比較:
if (!current == previous)
這 !給你一個錯誤說
操作員 '!' 不能應用于“T”型別的運算元
如果你洗掉它,你會得到:
運算子“==”不能應用于“T”和“T”型別的運算元
我放棄了代碼挑戰,因為它似乎在告訴我你真的無法將一個 T 與另一個進行比較。然后我發現你可以做到這一點,但只是使用不同的語法/使用特定的方法。
誰能告訴我為什么會這樣?
uj5u.com熱心網友回復:
.Equals是 的一部分System.Object。現在沒有辦法限制泛型支持特定的運算子多載。但是,您可以使用IEquatable<T>orIEqualityComparer<T>來確保該型別實作其相等定義。
uj5u.com熱心網友回復:
請參閱指定語言規范的這一部分==。您可以看到該語言僅具有這些==預定義多載:
bool operator ==(int x, int y);
bool operator ==(uint x, uint y);
bool operator ==(long x, long y);
bool operator ==(ulong x, ulong y);
bool operator ==(float x, float y);
bool operator ==(double x, double y);
bool operator ==(decimal x, decimal y);
bool operator ==(bool x, bool y);
bool operator ==(E x, E y); // for every enum E
bool operator ==(C x, C y); // for every class C
bool operator ==(string x, string y);
bool operator ==(System.Delegate x, System.Delegate y);
你的方法中的型別引數T不受任何約束,那么如果它是一個結構型別呢?從上面的串列中可以看出,沒有==為任意結構型別定義運算子。
如果你添加一個T: class約束,那么你就可以使用==它,因為==所有類都有一個運算子。
另一方面,在 中Equals宣告了一個方法System.Object,C# 中的每個型別都從該方法繼承。因此,可以使用Equalstype 的值T,即使T可以是任何型別。
uj5u.com熱心網友回復:
請注意,==如果物件是原始值型別、字串或具有定義的用戶結構,則只能表示值相等operator ==。
在所有其他情況下,==要么未定義(值型別),要么參考object.ReferenceEquals()檢查兩個變數是否參考記憶體中的同一物件。
請注意,新record型別支持==具有值語意的運算子,即使它們是參考型別。這是因為他們在幕后實作IEquatable<T>并定義operator ==使用.Equals().
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/412124.html
標籤:
上一篇:為什么“ ”有效但“::”不起作用,即使它們在scala中具有相同的邏輯
下一篇:使用泛型回傳函式的方法
