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

Eve*_*lyn 3 .net c# reflection system.reflection

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

int zero = 0;
object nullObj = null;
var iEquals = zero.GetType().GetInterface("IEquatable`1").GetMethod("Equals");
var reflectionEquals = iEquals.Invoke(zero, new[] { nullObj }); // true
var equals = ((IEquatable<int>)zero).Equals(nullObj); // false
Run Code Online (Sandbox Code Playgroud)

Gur*_*ron 7

来自MethodBase.Invoke文档:

如果反射方法的参数是值类型,并且参数中对应的参数是null,则运行时传递值类型 的零初始化实例

对于int零初始化的实例是0,因此True。另一个例子是bool- 对于布尔值零初始化的实例是false这样的:

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

演示@sharplab.io