You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 11:32:44