c#:( True == True)返回False

时间:2012-02-05 20:39:01

标签: c# boolean

我遇到问题(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。

3 个答案:

答案 0 :(得分:6)

我可以看到两种可能性:

  • useaction.Postcondition[goalneeds]current[goalneeds]返回bool以外的内容。它们返回一个具有ToString()方法的类的对象,该方法有时会返回字符串"True"。在您的情况下返回的特定对象都生成"True"但不是同一个对象,因此==为false(或者这些对象的类型以这样的方式重载==运算符返回false,或其ToString()方法返回"False"}的其他对象。

    (显然情况确实如此,虽然“类”实际上只是object,内部装有bool。这确实具有描述的效果,因为==执行参考在这种情况下是平等的。)

  • useaction.Postconditioncurrent(或两者)的索引器具有改变其自身价值的副作用。因此,第二次调用它会返回不同的结果。

如果你只是步入你引用的代码行并使用了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,这种方法会引发异常。