Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
比较时,没有键字段的VB.NET匿名类型与C#匿名类型有何不同?_C#_Vb.net_Anonymous Types - Fatal编程技术网

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

比较时,没有键字段的VB.NET匿名类型与C#匿名类型有何不同?,c#,vb.net,anonymous-types,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 .N

我对此挠头,因为我不明白为什么会发生以下情况:

'//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.
在C#中,匿名类型的所有属性的行为就好像它们在VB中具有
修饰符一样:这些属性是只读的,并且它们包含在相等和哈希代码求值中

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

从:

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

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

    • 它们具有相同数量的属性
    • 属性以相同的顺序声明,具有相同的名称和相同的推断类型。名称比较不区分大小写
    • 至少有一个属性是键属性,并且键关键字应用于相同的属性
    • 比较每对对应的密钥属性返回True
  • GetHashcode
    提供了一个适当唯一的
    GetHashcode
    算法。该算法仅使用密钥属性来计算哈希代码

  • ToString
    返回一个串接的属性值,如下例所示。包括键和非键属性


可能是因为相等/==差异。。你如何比较它们?如果字段相同,anynomus类中的C#equals将返回true。谢谢Jon(顺便说一句,喜欢你的第三版)。那么C#是否没有具有可变属性的匿名类型?如果是的话,你知道为什么它不支持,而VB.NET支持吗?@Rondles:不,C#不支持。恐怕我不确定这种差异是从哪里来的。