C# Object.Equals处的NullReferenceException(对象,对象) 处境

C# Object.Equals处的NullReferenceException(对象,对象) 处境,c#,nullreferenceexception,ilgenerator,object-equality,C#,Nullreferenceexception,Ilgenerator,Object Equality,我正在使用ILGenerator生成包装。我使用Object.Equals(Object,Object)实现包装器字段的相等比较。调试器抛出带有以下堆栈跟踪的NullReferenceException at System.Object.Equals(Object objA, Object objB) at HIDDEN.StateTransitionWrapper.op_Equality(StateTransitionWrapper , StateTransitionWrapper ) at

我正在使用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) 
....
相等(对象,对象)-反汇编 正如您在反汇编中看到的,不可能发生任何
NullReferenceException
,因为它不会到达方法调用所在的部分

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

调用IL代码
box
指令不应该指定要装箱的类型吗

例如,你不应该使用

box System.Int32  // or whatever
…而不是

box System.Object
box-typeTok操作码(ECMA-355第三部分,第4.2节)从堆栈中获取val并将其转换为obj。如果typeTok是参考类型,则
指令返回val未更改[emphasis added]作为obj。另一方面,当typeTok是值类型(至少是不可为空的类型)时,
box
创建一个新对象,并将数据从val复制到新对象中


正如@LukeH所指出的,上面的IL在应该使用
box[HIDDEN]HIDDEN.StationStateType时使用命令
box[mscorlib]System.Object
。后者仍将返回一个
对象
,该对象对
对象有效。Equals(object,object)
调用。我认为当前调用返回的对象无效,导致了
NullReferenceException

如何为使用的对象类型实现相等运算符?@ken2k StateTransitionWrapper中的两个对象都是值类型。StateTransitionWrapper是值类型吗?@AndreLoker否,它是一个类。您需要知道
HIDDEN.StateTransitionWrapper.op_Equality(StateTransitionWrapper,StateTransitionWrapper)
成功调用了
Object.Equals(Object,Object)
-方法,因此错误就发生在那里。它是由所采用的语言预先确定的。其定义见规范。没有对该行进行随机处理。如果您对一个对象进行强制转换以匹配
对象,则不会。相等(对象,对象)
需要两个对象。我相信@LukeH是正确的。IL
框[HIDDEN]隐藏。StationStateType
将返回一个
对象。通过使用
box System.Object
你说的是“将这个对象框到一个对象”。我认为这会剥离被装箱的值的实际类型。我不知道为什么会出现例外情况。你是对的,即使迈克的回答是更好地描述了这种行为,我还是给你评分。
box System.Int32  // or whatever
box System.Object