繁体   English   中英

Object.Equals(Object,Object)中的NullReferenceException

[英]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) 
....

Object.Equals(Object,Object) - 反汇编

public static bool Equals(object objA, object objB)
{
    return objA == objB || (objA != null && objB != null && objA.Equals(objB));
}

正如你在反汇编中看到的那样,任何NullReferenceException都不可能发生,因为它不会到达方法调用所在的部分。

可能的问题

正如我所说,通过使用ILGenerator生成孔代码,我认为这可能是错误的唯一可能来源。 调用者内部只有值类型,因此该对象甚至不可能为null。

致电IL-Code

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM