60 votes

String.Format Argument Null Exception

Le code ci-dessous produira l'exception Argument Null.

var test = string.Format("{0}", null); 

Cependant, cela donnera une chaîne vide

string something  = null; 
var test = string.Format("{0}", something); 

Je suis juste curieux de savoir pourquoi le deuxième morceau de code ne lève pas d'exception. S'agit-il d'un bug ?

76voto

Jon Skeet Points 692016

La différence est que le premier morceau de code appelle string.Format(string, object[]) ... tandis que le deuxième morceau de code appelle string.Format(string, object) .

null est un argument valide pour la deuxième méthode (on s'attend simplement à ce qu'il s'agisse de la valeur du premier caractère générique), mais pas pour la première (où l'attribut null serait généralement le tableau de placeholders). En particulier, comparez la documentation pour savoir quand NullArgumentException est lancé :

string.Format(string, object) :
format est null

Mais :

string.Format(string, object[]) :
format ou Arguments est null

Pensez à string.Format(string, object) comme étant mis en œuvre quelque chose comme :

public static string Format(string format, Object arg0)
{
    return string.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 = string.Format("{0}", args); 

// Working code
object[] args = new object[] { null }; // Array with 1 value
var test = string.Format("{0}", args);

16voto

Servy Points 93720

Le deuxième extrait de code appelle la surcharge suivante :

Format(String, Object)

Ici, la valeur peut être nulle, conformément à la documentation.

Le premier extrait de code utilise la surcharge suivante :

Format(String, Object[])  

Ici, le seconde valeur ne peut pas être nul conformément à la documentation.

0voto

Mark Hurd Points 4746

Un point mineur qui n'est pas mentionné dans les réponses existantes et qui rend la question presque sans objet :

Le message complet pour le ArgumentNullException est :

La valeur ne peut pas être nulle.
Nom du paramètre : args

Une autre partie du problème ici est null est d'un type quelconque. En le coulant explicitement en string ou object (ou utilisez la fonction C# default() ) permettrait d'éviter le problème.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X