Le code ci-dessous lancera une exception d’argument null
var test = ssortingng.Format("{0}", null);
Cependant, cela rendra une chaîne vide
ssortingng something = null; var test = ssortingng.Format("{0}", something);
Juste curieux de savoir pourquoi le deuxième code ne fait pas exception. Est-ce un bug?
La différence est que le premier morceau de code appelle ssortingng.Format(ssortingng, object[])
… alors que le second morceau de code appelle ssortingng.Format(ssortingng, object)
.
null
est un argument valide pour la seconde méthode (on s’attend simplement à ce qu’il soit la valeur du premier espace réservé), mais pas le premier (où le null
serait généralement le tableau des espaces réservés). En particulier, comparez la documentation lorsque NullArgumentException
est levée:
ssortingng.Format(ssortingng, object)
:
le format estnull
Mais:
ssortingng.Format(ssortingng, object[])
:
format ou args estnull
Pensez à ssortingng.Format(ssortingng, object)
comme étant implémenté quelque chose comme:
public static ssortingng Format(ssortingng format, Object arg0) { return ssortingng.Format(format, new object[] { arg0 } ); }
Donc, après un peu de remplacement, votre code est plus proche de:
// Broken code object[] args = null; // No array at all var test = ssortingng.Format("{0}", args); // Working code object[] args = new object[] { null }; // Array with 1 value var test = ssortingng.Format("{0}", args);
Le second fragment de code appelle la surcharge suivante:
Format(Ssortingng, Object)
Ici, la valeur peut être null, conformément à la documentation.
Le premier fragment de code utilise la surcharge suivante:
Format(Ssortingng, Object[])
Ici, la deuxième valeur ne peut pas être nulle , conformément à la documentation.
Un point mineur non mentionné par les réponses existantes, et rend presque la question discutable:
Le message complet pour l’ ArgumentNullException
est:
La valeur ne peut pas être nulle.
Nom du paramètre: args
Le fait que null
soit de n’importe quel type fait également partie du problème. Le lancer explicitement dans une ssortingng
ou un object
(ou utiliser la fonctionnalité C # default()
) éviterait le problème.