我遇到问题(true == true)返回false。
Console.WriteLine(
useaction.Postcondition[goalneeds].ToString() + "==" +
current[goalneeds].ToString() + " returns " +
(useaction.Postcondition[goalneeds] == current[goalneeds]).ToString());
输出:True==True returns False
useaction.Postcondition与current相同。
尽管预览颜色显示,“后置条件”不是静态的
感谢任何帮助,我不知道我可以分享的任何其他相关信息。
解决方案:
bool a = (bool)useaction.Postcondition[goalneeds];
bool b = (bool)current[goalneeds];
Console.WriteLine(a.ToString() + "==" + b.ToString() + " returns " + (a==b).ToString());
第一个代码比较了对象类型。第二个代码比较了bools。
答案 0 :(得分:6)
我可以看到两种可能性:
useaction.Postcondition[goalneeds]
和current[goalneeds]
返回bool
以外的内容。它们返回一个具有ToString()
方法的类的对象,该方法有时会返回字符串"True"
。在您的情况下返回的特定对象都生成"True"
但不是同一个对象,因此==
为false(或者这些对象的类型以这样的方式重载==
运算符返回false,或其ToString()
方法返回"False"
}的其他对象。
(显然情况确实如此,虽然“类”实际上只是object
,内部装有bool
。这确实具有描述的效果,因为==
执行参考在这种情况下是平等的。)
useaction.Postcondition
或current
(或两者)的索引器具有改变其自身价值的副作用。因此,第二次调用它会返回不同的结果。
如果你只是步入你引用的代码行并使用了Watch窗口,那么这两个都应该立即在调试器中可见。
答案 1 :(得分:4)
我打破了它:
您没有指定类型...所以我放入UnknownType
UnknownType t1 = useaction.Postcondition[goalneeds];
UnknownType t2 = current[goalneeds];
String s1 = t1.ToString();
String s2 = t2.ToString();
Bool b = (s1 == s2);
然后在调试器中单独观察每个步骤。
答案 2 :(得分:2)
如果索引器返回object
而不是bool
,则您将获得有关盒装值的引用相等性比较,这将始终返回false。在这种情况下,请改用.Equals
方法。这将起作用,因为它是由System.Boolean
覆盖的虚拟方法。 ==
运算符已重载,未被覆盖。
或者,正如Olivier Jacot-Descombes指出的那样,你可以拆开两个物体;但是,如果任何一个对象不是盒装bool,这种方法会引发异常。