没有关键字段的VB.NET匿名类型在比较时与C#匿名类型有何不同?

时间:2014-02-11 13:49:48

标签: c# vb.net anonymous-types

我正在摸不着头脑,因为我无法理解为什么会发生以下情况:

'//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那样?

1 个答案:

答案 0 :(得分:9)

在C#中,匿名类型的所有属性都表现得好像它们在VB中具有Key修饰符:属性是只读的,它们包含在相等和哈希码评估中。

在VB中,没有Key修饰符的属性是可变的,并且在Equals / GetHashCode实现中使用了

来自Anonymous Type Definition documentation

  

如果匿名类型声明包含至少一个键属性,则类型定义将覆盖从Object继承的三个成员:EqualsGetHashCodeToString。如果未声明任何键属性,则仅覆盖ToString。覆盖提供以下功能:

     
      如果两个匿名类型实例是同一个实例,或者它们满足以下条件,则
  • Equals返回True:

         
        
    • 它们具有相同数量的属性。
    •   
    • 属性以相同的顺序声明,具有相同的名称和相同的推断类型。名称比较不区分大小写。
    •   
    • 至少有一个属性是键属性,Key关键字应用于相同的属性。
    •   
    • 每对相应键属性的比较返回True。
    •   
  •   
  • GetHashcode提供了一种适当的唯一GetHashCode算法。该算法仅使用密钥属性来计算哈希码。
  •   
  • ToString返回一串连接的属性值,如以下示例所示。包括密钥和非密钥属性。
  •