59 votes

Pourquoi ai-je une exception lors du passage de la valeur "null" constante, mais pas lors du passage d'un "null" chaîne de référence?

Si j'exécute ce code:

Console.WriteLine( String.Format( "{0}", null ) );

Je reçois ArgumentNullException mais si j'exécute ce code:

String str = null;
Console.WriteLine( String.Format( "{0}", str ) );

il fonctionne très bien et le résultat est une chaîne vide.

Maintenant, les deux pièces d'aspect équivalent à moi, ils ont tous les deux passer une référence null en String.Format() encore le comportement est différent.

Comment id comportement différent possible ici?

76voto

Jon Skeet Points 692016

Juste décompiler le code fonctionne, ce qu'il se passe.

string.Format("{0}", null)

les appels les plus spécifiques applicables surcharge, qui est - string.Format(string, object[]).

Les surcharges de string.Format sont:

Format(String, Object)
Format(String, Object[])
Format(IFormatProvider, String, Object[])
Format(String, Object, Object)
Format(String, Object, Object, Object)

J'espère que c'est évident pourquoi les trois dernières options ne sont pas valides.

À travailler sur les deux premières à utiliser, le compilateur compare la conversion de l' null de Object à la conversion de l' null de Object[]. La conversion en Object[] est considéré comme "meilleur" car il y a une conversion de l' Object[] de Object, mais pas vice-versa. C'est la même logique qui, si nous avions:

Foo(String)
Foo(Object)

et appelés Foo(null), il serait pick Foo(String).

Si votre code d'origine est équivalent à:

object[] values = null;
string.Format("{0}", values);

À ce stade, nous espérons que vous auriez du attendre un ArgumentNullException - selon les documents.

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