C# ==使用反射的运算符

C# ==使用反射的运算符,c#,reflection,C#,Reflection,使用反射后的对象比较 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)

使用反射后的对象比较

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==oneO是真的。有人能解释一下这里发生了什么吗?

通过将int赋值给对象变量,您就是int。这将在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很有意义

old和Oldold是引用类型字符串,它们没有装箱,只是值类型 但是string是一种特殊的引用类型,它重载了相等运算符read 根据经验:如果使用引用类型,请小心使用==运算符。例如,System.String。但这是个例外。通常,您只是比较引用。装箱基本上使值类型成为引用类型,但这是一个隐藏的实现细节,即使oneO.GetType.IsValueType仍然返回true

还请注意,如果您有如下方法,也会发生此装箱转换:

public static bool SameThings(object obj1, object obj2)
{
    return obj1 == obj2;
}
我希望您不再对这一结果感到惊讶:


默认情况下,如果两个引用类型操作数引用同一个对象,则它们是相等的:也可以使用.Equals而不是==而不取消绑定OK,谢谢:这是一个预热。在进行了一点反思比较之后,我遇到了另一个问题:
Console.WriteLine(SameThings(1, 1));  // false