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());
第一个代码比较了对象类型。第二个代码比较了布尔值。
我可以看到两种可能性:
-
useaction.Postcondition[goalneeds]
和current[goalneeds]
返回除bool
以外的内容。它们返回具有ToString()
方法的类的对象,该方法有时返回字符串"True"
。在您的情况下返回的特定对象都生成"True"
但不是同一个对象,因此==
为 false(或者这些对象的类型以返回 false 的方式重载==
运算符,或者其他一些对象,其ToString()
方法返回"False"
(。(显然情况确实如此,尽管"类"实际上只是
object
里面有一个盒装bool
。这确实具有所描述的效果,因为在这种情况下==
执行引用相等。 -
useaction.Postcondition
或current
(或两者(的索引器具有更改其自身值的副作用。因此,它的第二次调用返回的结果与第一次不同。
如果您只是单步执行引用的代码行并使用"监视"窗口,则这两个选项都应立即在调试器中可见。
我会分解一下:
您没有指定类型...所以我放弃了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 所指出的,您可以取消装箱这两个对象;但是,如果任一对象不是盒装布尔值,则此方法将引发异常。