使用反射后的对象比较
var a = new A
{
a = "aa",
b = 1
};
var b = new A {
a = "aa",
b = 2
};
Type type = typeof(A);
object old = type.GetProperty("a").GetValue(a);
object Oldold = type.GetProperty("a").GetValue(b);
int one = 1;
int oneOne = 1;
object oneO = one;
object oneOneO = oneOne
// old == Oldold - true
// one == oneOne - true
// oneO == oneOneO - false
}
我希望oneO == oneOneO是真实的。有人可以解释一下这是怎么回事吗?
答案 0 :(得分:4)
通过将其分配给int
变量,您boxing是Object
。这样会创建一个新实例,并且==
中的System.Object
比较引用,它们是不同的,因此返回false
。
如果您将其放回(取消装箱)到int
,则==
将按预期工作:
object oneO = one;
object oneOneO = oneOne;
int newOne = (int) oneO;
int newOneOne = (int) oneOneO;
Console.WriteLine(newOne == newOneOne); // true
如果您使用Equals
而不是==
,它们也会按照预期进行比较,因为System.Int32
overrides Equals
有意义。
old
和Oldold
是未装箱的引用类型(字符串),仅是值类型根据经验:如果使用引用类型,请小心使用==
运算符。例如System.String
overloads the equality operator。但这是一个例外。通常,您只是在比较参考。装箱基本上使值类型成为引用类型,但这是一个隐藏的实现细节(即使oneO.GetType().IsValueType
仍返回true
)。
还请注意,如果您使用类似这样的方法,也会发生这种拳击转换:
public static bool SameThings(object obj1, object obj2)
{
return obj1 == obj2;
}
我希望您不再对此输出false
感到惊讶:
Console.WriteLine(SameThings(1, 1)); // false