-1

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

在此处输入图像描述

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

var one = true;
var two = true;

在此处输入图像描述

我破坏了 C# 还是什么?使用相等运算符时,同一方法调用范围内的两对布尔值(我仔细检查了它们的 .GetType() 返回布尔值)如何不一致?

虽然没关系,第一对(双等号方法返回错误的结果)是在可能会或可能不会更改属性值的方法调用之前和之后使用 PropertyInfo.GetValue(object target) 收集的在目标上。我使用 GetValue 两次以确保属性的值在“做某事”之前发生了变化。

我通过多次执行程序得到了相同的结果,所以我不认为这是执行环境的侥幸。

4

1 回答 1

5

你没有提供任何代码,但你提到你正在使用反射,所以也许你声明了currentValuenewValue作为object变量。如果是这种情况,那么您应该使用该Object.Equals方法来比较变量的值相等性:

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

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

object currentValue = true;
object newValue = true;
Console.WriteLine(currentValue == newValue); // False
Console.WriteLine(object.Equals(currentValue, newValue)); // True
于 2013-06-10T03:12:29.343 回答