¿Cuál sería el mejor tipo de excepción para lanzar cuando se invoca un método de extensión en una instancia nula (donde el método de extensión no lo permite)? Dado que los métodos de extensión no son más que métodos estáticos, podría argumentar que debería ser ArgumentNullException, pero por otro lado se usan como métodos de instancia, por lo que podría ser más natural usar la NullReferenceException. Tomemos el siguiente ejemplo:ArgumentNullException o NullReferenceException del método de extensión?
public static string ToInvariantString(this IFormattable value, string format)
{
return value.ToString(format, CultureInfo.InvariantCulture);
}
esta manera una NullReferenceException se produce si el parámetro valor es nulo.
El otro ejemplo sería:
public static string ToInvariantString(this IFormattable value, string format)
{
if (value == null) throw new ArgumentNullException("value");
return value.ToString(format, CultureInfo.InvariantCulture);
}
EDIT: En algunas de las respuestas que han señalado que un métodos de extensión se puede llamar como un método estático y en esos casos una excepción de referencia nula estaría mal, lo cual es un gran punto, y en realidad una de mis preocupaciones, no estoy seguro de por qué me olvidé de mencionar eso en la pregunta en primer lugar.
Alguien también señaló que es incorrecto lanzar una NullReferenceException, y sí, lo es. Es por eso que no lo tiro, simplemente dejo que suceda (deje que CLR lo lance) al no guardar el método.
Creo que estoy a favor de ArgumentNullException (eso es lo que he usado hasta ahora) pero sigo pensando que hay al menos espacio para argumentar en contra de la NullReferenceException ya que parece más natural en la mayoría de los lugares donde el método va a ser usado.
Excelentes comentarios y, como mencioné en mi edición de la publicación, esta es la razón por la que no lanzo explícitamente la NullReferenceException, todavía dejo que la CLR la emita. –
"No se produjo realmente una referencia nula". Sí lo hizo; pasaste una referencia nula y el método intentó desreferenciarla. – piedar
@piedar el método intentó desreferenciarlo, ¡no el tiempo de ejecución! –