我正在摸不着头脑,因为我无法理解为什么会发生以下情况:
'//VB.NET
Dim product1 = New With {.Name = "paperclips", .Price = 1.29}
Dim product2 = New With {.Name = "paperclips", .Price = 1.29}
'compare product1 and product2 and you get false returned.
Dim product3 = New With {Key .Name = "paperclips", Key .Price = 1.29}
Dim product4 = New With {Key .Name = "paperclips", Key .Price = 1.29}
'compare product3 and product4 and you get true returned.
'//C#
var product5 = new {Name = "paperclips", Price = 1.29};
var product6 = new {Name = "paperclips", Price = 1.29};
//compare products 5 and 6 and you get true.
产品1和2发生了什么使它们不像产品5和6那样?
答案 0 :(得分:9)
在C#中,匿名类型的所有属性都表现得好像它们在VB中具有Key
修饰符:属性是只读的,它们包含在相等和哈希码评估中。
在VB中,没有Key
修饰符的属性是可变的,并且在Equals
/ GetHashCode
实现中使用了 。
来自Anonymous Type Definition documentation:
如果匿名类型声明包含至少一个键属性,则类型定义将覆盖从
Object
继承的三个成员:Equals
,GetHashCode
和ToString
。如果未声明任何键属性,则仅覆盖ToString
。覆盖提供以下功能:如果两个匿名类型实例是同一个实例,或者它们满足以下条件,则
Equals
返回True:
- 它们具有相同数量的属性。
- 属性以相同的顺序声明,具有相同的名称和相同的推断类型。名称比较不区分大小写。
- 至少有一个属性是键属性,Key关键字应用于相同的属性。
- 每对相应键属性的比较返回True。
GetHashcode
提供了一种适当的唯一GetHashCode
算法。该算法仅使用密钥属性来计算哈希码。ToString
返回一串连接的属性值,如以下示例所示。包括密钥和非密钥属性。