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

Ben*_*enM 5 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.
Run Code Online (Sandbox Code Playgroud)

产品1和2发生了什么,使它们不像产品5和6那样?

Jon*_*eet 9

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

在VB中,没有性能Key改性剂是可变的,并且在使用Equals/ GetHashCode实施方式.

匿名类型定义文档:

如果匿名类型声明至少包含一个关键属性,类型定义覆盖三名成员来自继承Object:Equals,GetHashCode,和ToString.如果未声明任何键属性,则仅ToString重写.覆盖提供以下功能:

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

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

  • 谢谢Jon(享受你的第3版btw).那么C#没有具有可变属性的匿名类型吗?如果是这样,任何想法为什么它和VB.NET没有? (2认同)
  • @Rondles:不,C#不支持.我不确定这种差异来自哪里,我很害怕. (2认同)