.NET匿名类型相等性表现不符合预期
解决VB.NET匿名类型相等性不符合预期的问题
这个问题的核心是VB.NET匿名类型的默认行为和C#存在差异——你没有给匿名类型的字段加上Key关键字,导致编译器没有生成基于字段值的相等性判断逻辑。
在VB.NET中,匿名类型的属性默认是可变的,编译器不会把这类属性纳入Equals和GetHashCode的计算逻辑里。此时的相等性判断是基于对象引用的,而不是字段的名称和值。这就解释了为什么你的两个匿名实例字段值完全一致,但Equals返回false、哈希码也不同,最终导致GroupBy无法正确分组。
而.NET文档中描述的“同一程序集内匿名类型的相等性取决于字段的名称和值”,是针对带有Key修饰的属性的情况。只要给匿名类型的字段加上Key关键字,编译器就会自动重写Equals和GetHashCode方法,实现基于字段名称和值的相等性判断。
修正后的代码如下:
Dim anonymous1 = New With {Key .texta = "a", Key .textb = "b"} Dim anonymous2 = New With {Key .texta = "a", Key .textb = "b"} Dim compare = anonymous1.Equals(anonymous2) ' 此时compare的值为True
额外补充几个注意点:
- 所有需要参与相等性判断的属性都要加上
Key修饰; - 匿名类型中带
Key的属性是只读的,这也符合作为字典键或GroupBy键的不可变性要求; - 只有当两个匿名类型的
Key属性的名称、类型、顺序和值都完全一致时,才会被判定为相等(顺序要求和C#一致)。
内容的提问来源于stack exchange,提问作者Dionisis Hoholis
相关产品推荐
相关产品推荐

