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 esnull
Pero:
string.Format(string, object[])
:
formato o args esnull
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.