为何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
相关产品推荐
相关产品推荐

