![](/img/trans.png)
[英]LINQ Distinct() not work even implemented Equals() & GetHashCode()
[英]How are Equals and GetHashCode implemented on anonymous types?
幫助說:
匿名類型是直接從對象派生的類類型,並且不能強制轉換為除對象之外的任何類型。 編譯器為每種匿名類型提供一個名稱,盡管您的應用程序無法訪問它。 從公共語言運行時的角度來看,匿名類型與任何其他引用類型沒有什么不同。
如果程序集中的兩個或多個匿名對象初始化程序指定了具有相同順序,名稱和類型相同的屬性序列,則編譯器會將這些對象視為相同類型的實例。 它們共享相同的編譯器生成的類型信息。
因為匿名類型的Equals和GetHashCode方法是根據屬性的Equals和GetHashCode方法定義的,所以只有所有匿名屬性都相等時,相同匿名類型的兩個實例才相等。
這些都是對的,但是如何? 參考源明確顯示了如何比較對象( ReferenceEquals
),並且“直接從對象派生”的類型不能具有這種特殊行為。 它也不符合ValueType
中Equals
。
那怎么辦呢? 匿名類型如何在沒有任何可見替代的情況下覆蓋Equals()
和GetHashCode()
?
編譯器會為您生成GetHashCode()
和Equals()
覆蓋。 例如,從此代碼:
class Program
{
static void Main(string[] args)
{
var a = new { Text = "foo", Value = 17 };
Console.WriteLine(a);
}
}
您可以在已編譯的.exe中找到生成的匿名類型,其中的方法如下所示(這是dotPeek的輸出……還有ToString()
):
[DebuggerHidden]
public override string ToString()
{
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.Append("{ Text = ");
stringBuilder.Append((object) this.\u003CText\u003Ei__Field);
stringBuilder.Append(", Value = ");
stringBuilder.Append((object) this.\u003CValue\u003Ei__Field);
stringBuilder.Append(" }");
return ((object) stringBuilder).ToString();
}
[DebuggerHidden]
public override bool Equals(object value)
{
var fAnonymousType0 = value as \u003C\u003Ef__AnonymousType0<\u003CText\u003Ej__TPar, \u003CValue\u003Ej__TPar>;
return fAnonymousType0 != null && EqualityComparer<\u003CText\u003Ej__TPar>.Default.Equals(this.\u003CText\u003Ei__Field, fAnonymousType0.\u003CText\u003Ei__Field) && EqualityComparer<\u003CValue\u003Ej__TPar>.Default.Equals(this.\u003CValue\u003Ei__Field, fAnonymousType0.\u003CValue\u003Ei__Field);
}
[DebuggerHidden]
public override int GetHashCode()
{
return -1521134295 * (-1521134295 * 512982588 + EqualityComparer<\u003CText\u003Ej__TPar>.Default.GetHashCode(this.\u003CText\u003Ei__Field)) + EqualityComparer<\u003CValue\u003Ej__TPar>.Default.GetHashCode(this.\u003CValue\u003Ei__Field);
}
相關閱讀:
匿名類型的ToString如何工作?
為什么匿名類型等於實現比較字段?
匿名類型相等
為什么像這樣實現ValueType.GetHashCode()?
這些都不能直接解決您的問題,但是它們確實提供了有關這些替代的特定實現的一些相關見解。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.