在c#Visual Studio中3!= 3时


When 3 != 3 in c# Visual Studio

本问题已经有最佳答案,请猛点这里访问。

enter image description here

上面是Visual Studio 2015在调试某些C代码时的部分屏幕截图。cachedlist[2][uniquecolumn.name]是一个int,它的值是3,值也是一个in,它的值也是3,但是当我比较这两个值时,得到了错误的结果。怎么会这样?


这是因为整数被装箱("包装"在对象中),而对象的比较是通过引用进行比较的:它们是内存中的同一对象吗,回答:否。

如果您希望按值比较它们,并且您知道它们始终都是int(并且您希望在代码中明确说明这一点),那么可以使用类型转换来取消装箱和==来比较:

1
var isEqual = (int)CachedList[2][uniqueColumn.Name] == (int)value;

(参见.NET小提琴:https://dotnetfiddle.net/z3lwbg)

如果两个对象中的类型不总是int,但您知道或假定它们是完全相同的类型,则可以使用.Equals()

1
var isEqual = CachedList[2][uniqueColumn.Name].Equals(value);

注意,这可能仍然不能总是给出所需的结果。如果一个是盒装的int,另一个是盒装的long,那么-因为类型不同-Equals()将返回false,即使值本身可能被认为是相等的,就像在(object)3(object)3L中那样。在这种情况下,Equals()甚至不尝试比较这些值。