You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何C#中int类型0调用IEquatable.Equals时直接调用返回false而反射调用返回true?

问题原因解析

这两种调用结果差异的核心,在于编译器的方法绑定规则与反射调用的参数处理逻辑不同:

  • 直接调用的实际绑定目标
    执行((IEquatable<int>)zero).Equals(nullObj)时,nullObj是object类型。由于IEquatable<int>.Equals的参数是值类型int,而null无法直接转换为值类型,编译器不会将此调用绑定到IEquatable<int>.Equals(int),而是自动转向object.Equals(object)方法。此时实际是比较装箱后的int(0)与null,结果自然为false。

  • 反射调用的参数处理逻辑
    通过反射获取的是IEquatable<int>.Equals(int)方法,调用Invoke传入null时,CLR会对值类型参数做特殊处理:因为值类型不能为null,CLR会自动将null替换为int的默认值0。实际执行的是zero.Equals(0),所以返回true。

内容的提问来源于stack exchange,提问作者Evelyn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 10:10:21