3

状況

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コードの呼び出し

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)
4

2 に答える 2

3

box命令はあなたが箱に入れようとしているタイプを指定するべきではありませんか?

たとえば、使用するべきではありません...

box System.Int32  // or whatever

...それよりも...

box System.Object
于 2012-02-28T17:05:29.100 に答える
2

ボックスtypeTokopcode(ECMA-355パーティションIII、セクション4.2)は、スタックからvalを取得し、それをobjに変換します。typeTokが参照型の場合、命令boxvalを 変更せずに[強調を追加] objとして返します。一方、typeTokが値型(少なくともnull許容型ではない)の場合、新しいオブジェクトを作成し、 valboxから新しいオブジェクトにデータをコピーします。

@LukeHが指摘しているように、上記のILは、をbox [mscorlib]System.Object使用する必要があるときにコマンドを使用していますbox [HIDDEN]HIDDEN.StationStateType。後者は、呼び出しobjectに有効なを返します。Object.Equals(Object, Object)現在の呼び出しは、を引き起こしている無効なオブジェクトを返していると思いますNullReferenceException

于 2012-02-28T20:19:34.123 に答える