separador miles fecha c#

c# - miles - String.Format Argumento nula excepción



string format separador miles c# (3)

El segundo fragmento de código está llamando a la siguiente sobrecarga:

Format(String, Object)

Aquí el valor puede ser nulo, según la documentación.

El primer fragmento de código utiliza la siguiente sobrecarga:

Format(String, Object[])

Aquí el segundo valor no puede ser nulo , según la documentación.

El siguiente código lanzará Argument Null Exception

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

Sin embargo, esto devolverá una cadena vacía

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

Solo tengo curiosidad por saber por qué el segundo fragmento de código no produce una excepción. ¿Es esto un error?


La diferencia es que la primera parte del código está llamando a string.Format(string, object[]) ... mientras que la segunda parte del código está llamando a string.Format(string, object) .

null es un argumento válido para el segundo método (solo se espera que sea el valor para el primer marcador de posición), pero no el primero (donde el null normalmente sería la matriz de marcadores de posición). En particular, compare la documentación de cuándo se lanza NullArgumentException :

string.Format(string, object) :
el formato es null

Pero:

string.Format(string, object[]) :
formato o args es null

Piense en string.Format(string, object) como algo implementado como:

public static string Format(string format, Object arg0) { return string.Format(format, new object[] { arg0 } ); }

Entonces, después de un poco de reemplazo, su código está más cerca 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);


Un punto menor no mencionado por las respuestas existentes, y casi hace que la pregunta sea discutible:

El mensaje completo para la ArgumentNullException es:

El valor no puede ser nulo.
Nombre del parámetro: args

También parte del problema aquí es null es de cualquier tipo. El hecho de convertirlo explícitamente en una string u object (o utilizar la función default() C #) evitaría el problema.