NullReferenceException sur object.equals (objet, objet)
-
14-11-2019 - |
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)
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
.