c#: (True==True) returning False

本文关键字:True returning False | 更新日期: 2023-09-27 18:22:28

我遇到了(true==true(返回false的问题。

Console.WriteLine(
    useaction.Postcondition[goalneeds].ToString() + "==" + 
    current[goalneeds].ToString() + " returns " + 
    (useaction.Postcondition[goalneeds] == current[goalneeds]).ToString());

输出:True==True returns False

使用操作。后置条件与当前条件的类型相同。

尽管预览颜色说,"后条件"不是静态

任何帮助不胜感激,我不知道我可以分享的任何其他相关信息。

溶液:

                bool a = (bool)useaction.Postcondition[goalneeds];
                bool b = (bool)current[goalneeds];
                Console.WriteLine(a.ToString() + "==" + b.ToString() + " returns " + (a==b).ToString());

第一个代码比较了对象类型。第二个代码比较了布尔值。

c#: (True==True) returning False

我可以看到两种可能性:

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

    (显然情况确实如此,尽管"类"实际上只是object里面有一个盒装bool。这确实具有所描述的效果,因为在这种情况下==执行引用相等。

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

如果您只是单步执行引用的代码行并使用"监视"窗口,则这两个选项都应立即在调试器中可见。

我会分解一下:
您没有指定类型...所以我放弃了UnknownType

UnknownType t1 = useaction.Postcondition[goalneeds];
UnknownType t2 = current[goalneeds];
String s1 = t1.ToString();
String s2 = t2.ToString();
Bool b = (s1 == s2);

然后在调试器中分别观察每个步骤。

如果索引器返回object而不是bool,则会得到对盒装值的引用相等性比较,该比较将始终返回 false。 在这种情况下,请改用 .Equals 方法。 这将起作用,因为它是一个被 System.Boolean 覆盖的虚拟方法。 ==运算符是重载的,而不是覆盖的。

或者,正如 Olivier Jacot-Descombes 所指出的,您可以取消装箱这两个对象;但是,如果任一对象不是盒装布尔值,则此方法将引发异常。