Question

Situation

Je génère des emballages en utilisant l'ilGenerator. j'utilise Object.Equals(Object, Object) Pour la mise en œuvre de l'égalité compare des champs de wrapper. Le débogueur lance un NullReferenceException avec la trace de pile suivante.

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 (objet, objet) - démontage

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

Comme vous pouvez le voir dans le démontage, il est impossible que NullReferenceException peut se produire car il n'atteindra pas la partie où se trouve l'appel de la méthode.

Problèmes possibles

Comme je l'ai dit, le code du trou est généré en utilisant l'ILGenerator et je pense que cela pourrait la seule source possible pour l'erreur. L'appelant n'a que des types de valeur à l'intérieur, il n'est donc même pas possible que l'objet soit nul.

Appeler 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)
Était-ce utile?

La solution

Ne devrait pas le box Instruction Spécifiez le type que vous essayez de boxer?

Par exemple, ne devriez-vous pas utiliser ...

box System.Int32  // or whatever

...plutôt que...

box System.Object

Autres conseils

La boîte typetok OPCODE (ECMA-355 Partition III, section 4.2) prend val de la pile et le convertit en obj. Si typetok est un type de référence, le box Retours d'instructions val inchangé l'accent ajouté] comme obj. Lorsque typetok est un type de valeur (au moins un non-nullable), d'autre part, box crée un nouvel objet et copie les données de val dans le nouvel objet.

Comme le souligne @lukeh, l'IL ci-dessus utilise la commande box [mscorlib]System.Object Quand il doit utiliser box [HIDDEN]HIDDEN.StationStateType. Ce dernier rendra toujours un object qui sera valable pour le Object.Equals(Object, Object) appel. Je crois que l'appel actuel renvoie un objet non valide qui cause le NullReferenceException.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top