Duplicar posible:
How does the method overload resolution system decide which method to call when a null value is passed?nulo resolución de sobrecarga literal tipo de parámetro
Ésta es una pregunta acerca de por qué el compilador elige una cierta sobrecarga cuando se pasa un valor nulo literal como parámetro, demostrada por string.Format sobrecargas.
cadena.Formato arroja un ArgumentNullException
cuando se utiliza el literal nulo para el parámetro args.
string.Format("foo {0}", null);
El método de formato tiene algunas sobrecargas.
string.Format(string, object);
string.Format(string, object[]);
string.Format(IFormatProvider, string, object[]);
Correr a través del código decompiled, la excepción de los args literales nulos se lanza desde el segundo método. Sin embargo, los siguientes ejemplos llaman al primer método anterior (como se esperaba) y luego llama al segundo, que llama al tercero y luego devuelve simplemente "foo".
string x = null;
string.Format("foo {0}", x);
string y;
string.Format("foo {0}", y = null);
Pero string.Format("foo {0}", null)
llama el segundo método anterior y resulta en una excepción nula. ¿Por qué el compilador decide que el literal nulo coincide con la segunda firma de método en lugar de la primera en este caso?
Quizás amplíe el título/alcance si esto abarca varargs en un sentido más general (si no es cadena.Formato específico) ... –
Pete, probablemente sea consciente de esto (y no es una respuesta a su pregunta) pero aunque lo mencionaría; para evitar esta excepción, puede usar 'String.Formato ("Prueba {0}", String.Empty); '. Todo lo mejor. – MoonKnight
Pregunta duplicada: http://stackoverflow.com/q/5173339/25727. En resumen: la resolución de sobrecarga prefiere tipos más específicos. Por lo tanto, elige la matriz porque 'object' es el tipo más inespecífico en .NET. – Jan