2012-02-08 19 views
8

Por lo tanto, estoy haciendo una gran cantidad de trabajo de base de datos en una aplicación, y hay varios posibles valores de retorno de mi sistema de almacenamiento en caché. Puede devolver nulo, puede devolver un valor predeterminado (tipo) o puede devolver un objeto no válido (por objeto no válido, me refiero a uno con propiedades/valores incorrectos). Quiero crear un método de extensión para hacer todas esas comprobaciones para mí, así:Método de extensión de comprobación nula

public static bool Valid<T> (this T obj) where T: class 
    { 
     if (obj == null) 
      return false; 
     else if (obj == default(T)) 
      return false; 
     //Other class checks here 
     else 
      return true; 
    } 

El problema es que mi compilador me dice que siempre habrá if (obj == default(T)) falsa.

¿Por qué es eso?

+0

Le está dando un error o advertencia del compilador. No recibo ninguno. compila bien –

+3

@GregB. Probablemente sea 'resharper' lo que le da una pista ... – gdoron

+0

@GregB sí, tengo un reafilamiento. – caesay

Respuesta

21

Puesto que usted tiene una restricción de "clase" (where T: class), default(T) es siempre igual a null. Ya tiene un cheque para eso en la declaración if original, por lo que el segundo caso (obj == default(T)) nunca podría ser cierto.

0

La primera decisión que debe hacer es: ¿Puede T ser un tipo de valor como int?
Si es así puede quitar

where T: class 

y

if (obj == null) return false; 
else 

Si T es siempre un tipo de referencia puede quitar

if (obj == null) return false; 
1

No estoy seguro de si están limitando a la clase porque quieres o porque sientes que tienes que hacerlo. Si es esto último, aquí hay una manera de hacerlo valor por defecto la comprobación de tipos complejos y simples:

public static bool Valid<T> (this T obj) 
{ 
    return !EqualityComparer<T>.Default.Equals(obj, default(T)); 
} 

Si su elección a la restringen a clase sólo fue intencional o de un modelo de negocio, no dude en hacer caso omiso de esta sugerencia . Otra cosa que esto no puede explicar es el boxeo de tipos simples (aunque usualmente utilizo tipos simples que aceptan nulos esta vez, para lo cual este código funciona).

Cuestiones relacionadas