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

Why does integer '0' IEquatable.Equals return true against a null object when called through reflection but false when called on the integer?

提问人:Evelyn 提问时间:11/14/2023 最后编辑:Guru StronEvelyn 更新时间:11/15/2023 访问量:93

问:

从整数 0 调用 IEquatable.Equals 以针对 null 对象进行测试应返回 false,但在使用反射时,它将返回 true。给定以下代码,我希望 for 和返回“false”,但反射代码返回 true,为什么?我在 C# 7.3 和 .NET Framework 4.6.2 上:iEqualsequals

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
C# NET 系统.反射

评论

3赞 Charlieface 11/14/2023
您没有调用相同的方法。 调用,因为不是 .((IEquatable<int>)zero).Equals(nullObj)object.EqualsnullObjint

答:

7赞 Guru Stron 11/14/2023 #1

MethodBase.Invoke 文档:

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

对于零初始化的实例是 ,因此 。另一个例子可以是 - 对于布尔值,零初始化实例是这样的:int0Trueboolfalse

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

演示@sharplab.io

评论

1赞 Flydog57 11/14/2023
好找。您将获得与 .当然,这与你发现的一致,是一个值类型 - 只是包含在其范围内的一个类型。反思的方式往往是高深莫测的int?int?null