【发布时间】:2017-02-10 12:09:33
【问题描述】:
【问题讨论】:
-
请向我们提供更多详细信息。在这种情况下,
value是什么?
标签: c# object if-statement int
【问题讨论】:
value 是什么?
标签: c# object if-statement int
您调用的== 运算符是采用两个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。
【讨论】:
问题是您正在比较的int 的两个对象包装器是不同的对象。
由于object 不会通过调用Equals 覆盖==,因此比较会改为检查引用,并返回false,因为这两个对象不同。
你可以使用object.Equals(item, value)来避免这个问题。
【讨论】:
当您将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 为真
【讨论】: