2009-02-26 18 views
7

Mi código es ...¿Por qué está haciendo Resharper la siguiente recomendación?

public static void AssertNotNull<T>(string name, T val) { 
    if (val == null) 
     throw new ArgumentNullException(String.Format("{0} must not be null", name)); 
} 

ReSharper está recomendando ...

public static void AssertNotNull<T>(string name, T val) { 
    if (Equals(val, default(T))) 
     throw new ArgumentNullException(String.Format("{0} must not be null", name)); 
} 
+0

Son esas cosas las que hacen que el respirador valga diez veces el dinero. –

+1

Pregunta interesante +1, solo una cosa podría incluir más información en el título para que la próxima vez sea más fácil decir "¿Por qué resharper recomienda reemplazar val == null con Equals (val, default (T))" Gracias. –

Respuesta

13

Debido a que no sabe si T es un tipo de valor o tipo de referencia, por lo que hace que el código funcione con ambos.

+0

así que si quería hacer lo siguiente para asegurarme de que es un tipo de ref, ¿qué puse para XXX? public static void AssertNotNull (nombre de cadena, T val) donde T: XXX – JeremyWeir

+0

nm Michael Meadows respondió esa parte – JeremyWeir

+2

En este caso estoy en desacuerdo con Resharper si es por eso que está dando ese error. Piénselo, si T es un int, y el valor IS en realidad es 0 y DEBERÍA ser cero, emitirá una excepción, mientras que si comprueba null, no arrojaría una excepción. – BFree

12

Me segunda respuesta de Berado, pero añadiría que se puede evitar que esto añadiendo la restricción a continuación:

public static void AssertNotNull<T>(string name, T val) where T : class 
+0

gracias, eso tiene mucho sentido – JeremyWeir

1

Estos dos métodos no son equivalentes. El primero permite AssertNotNull ("foo", 0) mientras que el segundo tira. Creo que Resharper está siendo demasiado entusiasta en este caso.

+0

Su punto está en el lugar. Resharper lo marca como advertencia (amarillo) de forma predeterminada. Solo quiere advertirle que este método no funcionará como se espera para todas las entradas posibles. –

+0

er, una revisión: AssertNotNull ("foo", 0) no arrojará una excepción, actuará como si fuera un valor nulo, ya que el valor predeterminado para int es 0, por lo que Equals (val, default (T)) evalúa a verdad –

+0

Quise decir que "throw new ArgumentNullException" se ejecutará en el segundo método. ¿Estás de acuerdo? – Greg

2

Esto, obviamente, no es lo que desea en este caso, sino que sólo está tratando de ser útil, asegurándose de que no se introducen un error al olvidar que los tipos de referencia pueden ser utilizados para T. Como @Michael Meadows dijo, es probable que desee agregar la restricción class al T.

0

Supongo que porque T podría ser un tipo sin referencia.

0

si sabes que T siempre será una clase, luego agrega una cláusula where para decirlo, entonces tu código original estará bien.

public static void AssertNotNull<T>(string name, T val) 
    where T : class 
    { 
     if (val == null) 
      throw new ArgumentNullException(String.Format("{0} must not be null", name)); 
    } 
Cuestiones relacionadas