林克投向对象

本文关键字:对象 林克 | 更新日期: 2023-09-27 18:30:32

为什么这段代码很好:

var rowsfilterdbyvaluemembercolumn =
    this.PrimaryDataSource.AsEnumerable().Where(r => r.Field<object>(this.ValueMemberColumn) == value);

而且这段代码不好:

var rowsfilterdbyvaluemembercolumn =
    this.PrimaryDataSource.AsEnumerable().Where(r => r.Field<int>(this.ValueMemberColumn) == Convert.ToInt32(value));

谁能解释一下?

林克投向对象

因为第一个,r.Field<object>将值视为对象,因此对value进行引用比较。因为两者不是同一个对象,所以它们比较为不相等。

第二个将this.ValueMemberColumn转换为整数,并与通过调用 ToInt32 创建的整数进行值比较。

有关详细信息,请参阅 C# 编程指南中的相等比较。

当您将两个整数作为对象进行比较时,会发生以下情况: 编译器生成代码来装箱这两个整数,以便它们现在是引用类型。因此,它们现在被视为对象,编译器正在此类型上查找 == 运算符重载。对象类型没有该值,因此它会回退到引用比较(它不调用 Equals)。即使整数相等,它们也始终被装箱为两个实例。所以它们现在不是平等的参照物,也没有被平等对待。