【问题标题】:if (<object> == <int>)if (<object> == <int>)
【发布时间】:2017-02-10 12:09:33
【问题描述】:

我不明白,为什么下图中的if 语句返回false。 希望你能给我解释一下。

可以看到,两个变量的值和类型都是一样的。

【问题讨论】:

  • 请向我们提供更多详细信息。在这种情况下,value 是什么?

标签: c# object if-statement int


【解决方案1】:

您调用的== 运算符是采用两个object 参数的重载。这使用引用相等 - 值并不重要,它必须是 相同的 对象。

正如您在the documentation 中看到的那样:

对于字符串以外的引用类型,== 如果它的两个操作数引用同一个对象,则返回 true。对于字符串类型,== 比较字符串的值。

虽然int 是一个值类型,但它一直是'boxed'(包装在object 中)。您正在比较包装整数的两种不同引用类型。

要解决此问题,您可以改用object.Equals - 这将比较两个整数。

item.Equals(value);

或者静态方法(处理item == null的情况):

object.Equals(item, value);

如果您取消装箱到int,那么您可以按照您的预期使用==int 重载:

(int)item == (int)value;

再次,根据文档:

对于预定义的值类型,相等运算符 (==)如果其操作数的值相等,则返回 true。

【讨论】:

    【解决方案2】:

    问题是您正在比较的int 的两个对象包装器是不同的对象。

    由于object 不会通过调用Equals 覆盖==,因此比较会改为检查引用,并返回false,因为这两个对象不同。

    你可以使用object.Equals(item, value)来避免这个问题。

    【讨论】:

      【解决方案3】:

      当您将int 转换为object 时,您正在创建一个新对象。这称为装箱

      任何比较都将是对象比较。对于对象,== 运算符将检查引用是否相同。它不会检查两个变量是否引用等效对象,它会检查两个变量是否引用一个对象。

      如果要执行 int 比较,必须将其转换回整数(拆箱)。

      或者,您可以使用 Equals 代替 == 运算符。

      这里有一段代码演示了这一点:

      using System;
      
      public class Program
      {
          public static void Main()
          {
              int n = 3;
              object o1 = n;
              object o2 = n;
              Console.WriteLine("o1 == o2 is {0}", o1 == o2);
              Console.WriteLine("o1.Equals(o2) is {0}", o1.Equals(o2));
              Console.WriteLine("(int)o1 == (int)o2 is {0}", (int)o1 == (int)o2);
      
          }
      }
      

      输出:

      o1 == o2 为假

      o1.Equals(o2) 为真

      (int)o1 == (int)o2 为真

      【讨论】:

        猜你喜欢
        • 2015-01-05
        • 1970-01-01
        • 2020-07-03
        • 1970-01-01
        • 2011-10-11
        • 1970-01-01
        • 1970-01-01
        • 2018-01-25
        • 2022-10-06
        相关资源
        最近更新 更多