.net 为什么整数'0' IEquatable.Equals在通过反射调用时针对空对象返回true,而在整数上调用时返回false?

v440hwme  于 2023-11-20  发布在  .NET
关注(0)|答案(1)|浏览(176)

从整数0调用IEquatable.Equals来测试null对象应该返回false,但是当使用反射时,它返回true。给定以下代码,我希望iEqualsequals返回'false',但是反射代码返回true,为什么?我使用C# 7.3和.NET Framework 4.6.2:

  1. int zero = 0;
  2. object nullObj = null;
  3. var iEquals = zero.GetType().GetInterface("IEquatable`1").GetMethod("Equals");
  4. var reflectionEquals = iEquals.Invoke(zero, new[] { nullObj }); // true
  5. var equals = ((IEquatable<int>)zero).Equals(nullObj); // false

字符串

aamkag61

aamkag611#

MethodBase.Invoke文档:
如果反射方法的参数是值类型,并且参数中对应的参数是null,则运行时传递值类型的零初始化示例
对于int,零初始化示例是0,因此True。另一个例子可以是bool-对于布尔值,零初始化示例是false,因此:

  1. object nullObj = null;
  2. bool zero = false;
  3. var m = zero.GetType().GetInterface("IEquatable`1").GetMethod("Equals");
  4. Console.WriteLine(m.Invoke(zero, new[]{nullObj})); // True

字符串
sharplab.io

相关问题