![](/img/trans.png)
[英]Why NullReferenceException is thrown in overriden Object.Equals method?
[英]NullReferenceException at Object.Equals(Object, Object)
我正在使用ILGenerator生成包装器。 我使用Object.Equals(Object, Object)
来实现包装器字段的相等比较。 调试器抛出NullReferenceException
其中包含以下堆栈跟踪。
at System.Object.Equals(Object objA, Object objB)
at HIDDEN.StateTransitionWrapper.op_Equality(StateTransitionWrapper , StateTransitionWrapper )
at HIDDEN.StateTransitionWrapper.Equals(Object )
at System.Object.Equals(Object objA, Object objB)
at HIDDEN.StationEventCompositeWrapper.op_Equality(StationEventCompositeWrapper , StationEventCompositeWrapper )
at HIDDEN.StationEventCompositeWrapper.Equals(Object )
at System.Object.Equals(Object objA, Object objB)
at HIDDEN.CompareResult..ctor(Object object0, Object object1, String fieldName)
....
public static bool Equals(object objA, object objB)
{
return objA == objB || (objA != null && objB != null && objA.Equals(objB));
}
正如你在反汇编中看到的那样,任何NullReferenceException
都不可能发生,因为它不会到达方法调用所在的部分。
正如我所说,通过使用ILGenerator生成孔代码,我认为这可能是错误的唯一可能来源。 调用者内部只有值类型,因此该对象甚至不可能为null。
IL_0040: ldarg.0
IL_0041: call instance valuetype [HIDDEN]HIDDEN.StationStateType HIDDEN.StateTransitionWrapper::get_StationState()
IL_0046: box [mscorlib]System.Object
IL_004b: ldarg.1
IL_004c: call instance valuetype [HIDDEN]HIDDEN.StationStateType HIDDEN.StateTransitionWrapper::get_StationState()
IL_0051: box [mscorlib]System.Object
IL_0056: call bool [mscorlib]System.Object::Equals(object, object)
box
指令不应该指定你想要盒子的类型吗?
例如,你不应该使用......
box System.Int32 // or whatever
...而不是...
box System.Object
box typeTok操作码(ECMA-355 Partition III,第4.2节)从堆栈中获取val并将其转换为obj 。 如果typeTok是引用类型,则box
指令返回val 不变 [emphasis added]作为obj 。 当typeTok是一个值类型(至少是一个非可空的值)时,另一方面, box
创建一个新对象并将数据从val复制到新对象中。
正如@LukeH指出的那样,上面的IL正在使用命令box [mscorlib]System.Object
,它应该使用box [HIDDEN]HIDDEN.StationStateType
。 后者仍然会返回一个object
,这将是有效的Object.Equals(Object, Object)
呼叫。 我相信当前调用返回一个导致NullReferenceException
的无效对象。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.