Ssortingng.Format Argument Null Exception

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 est null

Mais:

ssortingng.Format(ssortingng, object[]) :
format ou args est null

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.