林克投向对象
本文关键字:对象 林克 | 更新日期: 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)。即使整数相等,它们也始终被装箱为两个实例。所以它们现在不是平等的参照物,也没有被平等对待。