C#布尔值比较错误?

时间:2013-06-10 03:08:40

标签: c# struct equality

这怎么可能?这两个值都在内存中,并且在设置了两个值后,执行在断点处暂停。我很难找到一个if语句来检查两个bool是否不同,当值实际上相同时执行。所以我在同一个断点处使用立即窗口深入研究。

enter image description here

好奇,我停止了程序并且(在原始调试点,我注意到这种不一致)我插入了几行代码:

var one = true;
var two = true;

enter image description here

我是否打破了C#或其他什么?如何在同一个方法调用范围中使用两对布尔值(我仔细检查它们的.GetType()返回布尔值)是否使用相等运算符不一致?

虽然它无关紧要,但第一对(其中double equals方法返回错误的结果)是在方法调用之前和之后使用PropertyInfo.GetValue(对象目标)收集的,可能会也可能不会更改值目标上的财产。我正在使用GetValue两次,以确保在“做某事”之前更改了属性的值。

我在程序的许多执行中得到了相同的结果,所以我认为这不会影响执行环境。

1 个答案:

答案 0 :(得分:4)

您没有提供任何代码,但是您提到您正在使用Reflection,因此您可能将currentValuenewValue声明为object个变量。如果是这种情况,那么您应该使用Object.Equals方法来比较值相等的变量:

if (object.Equals(currentValue, newValue))
{
    ...
}

Boxing相同的布尔值两次将创建两个不同的对象,因此==运算符在与两个object变量一起使用时检查引用的相等性,将返回false:

object currentValue = true;
object newValue = true;
Console.WriteLine(currentValue == newValue); // False
Console.WriteLine(object.Equals(currentValue, newValue)); // True