【问题标题】:c#: (True==True) returning False [closed]c#: (True==True) 返回 False [关闭]
【发布时间】:2012-02-27 11:55:39
【问题描述】:

我在 (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());

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

【问题讨论】:

  • useaction.Postcondition[goalneeds]是真的bools吗?
  • 两个数组的类型是什么?
  • useaction.Postcondition 是什么类型?你是否在另一个线程中改变了其中一个集合?
  • true=="true" 与true==true 不同
  • 这些布尔值是从哪里来的?清理托管代码?或者可能是非托管代码或不安全的托管代码?

标签: c# boolean


【解决方案1】:

我可以看到两种可能性:

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

    (显然情况确实如此,尽管“类”实际上只是 object 内部带有一个框起来的 bool。这确实具有所描述的效果,因为 == 在这种情况下执行引用相等。)

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

如果您只是单步到您引用的代码行并使用了 Watch 窗口,那么这两者都应该立即在调试器中可见。

【讨论】:

    【解决方案2】:

    我会分解它:
    你没有指定类型......所以我放弃了UnknownType

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 或与(bool)obj1 == (bool)obj2比较。
      • @OlivierJacot-Descombes 谢谢;我编辑了答案以纳入您的建议。
      猜你喜欢
      • 2017-05-02
      • 2013-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多