2009-03-15 19 views
47

Tengo un parámetro 'opcional' en un método que es un KeyValuePair. Yo quería una sobrecarga que pasa nulo con el método básico para este parámetro, pero en el método básico, cuando quiero comprobar si el KeyValuePair es nulo, me sale el siguiente error:¿Cómo no se puede comparar un objeto con nulo?

Operator '!=' cannot be applied to operands of type System.Collections.Generic.KeyValuePair<string,object>' and '<null>. 

¿Cómo no voy a estar permitido verificar si un objeto es nulo?

+0

¿Puedes dar un ejemplo de código que muestre este error? –

+2

Ver también: http://stackoverflow.com/questions/1335419/how-can-i-make-sure-that-firstordefaultkeyvaluepair-has-returned-a-value –

Respuesta

78

KeyValuePair<K,V> es una estructura, no una clase. Es como hacer:

int i = 10; 
if (i != null) ... 

(A pesar de que en realidad es legal, con una advertencia, debido a las reglas de conversión anulables impares La cosa importante es que la condición if nunca será cierto..)

Para que sea "opcional", puede usar la forma que admite nulos:

static void Foo(KeyValuePair<object,string>? pair) 
{ 
    if (pair != null) 
    { 
    } 
    // Other code 
} 

¿Nota? en KeyValuePair<object,string>?

+1

Gracias, nunca se me pasó por la mente que era una estructura. Duh! – ProfK

+4

"(i! = Null)" genera una advertencia, pero lamentablemente no existe tal advertencia para un tipo de valor definido por el usuario que sobrecarga Equals/== /! = De acuerdo con las pautas de MSDN. Muy confuso cuando implemento "struct Foo" y mi cliente espera que "if (someFoo! = Null)" sea una forma razonable de verificar si algúnFoo tiene un valor. :-p – yoyo

7

Como KeyValuePair es una estructura (un tipo de valor), solo puede comparar nulos en los tipos de referencia.

Supongo que aún no ha escrito esa sobrecarga adicional. Fallará cuando intente pasar null como el valor de un KeyValuePair.

3

KeyValuePair < K, V > es una estructura y, por lo tanto, no puede ser nula bajo ninguna circunstancia. Solo un tipo de referencia puede ser nulo.

Si está tratando de detectar un valor incorrecto, deberá validar los miembros de clave y valor individualmente.

-8

Puede usar KeyValuePair.IsNull() para determinar si se ha establecido KeyValuePair.

+0

¿Dónde obtiene KeyValuePair.IsNull()? Un método de extensión? – Mark

12

Estoy respondiendo este a pesar de su edad, ya que es la primera Google resultado para "KeyValuePair prueba para nulo"

La respuesta especificado es correcto, pero no responde por completo el problema, al menos la que Estaba teniendo, donde tengo que probar la existencia del KeyValuePair y pasar a otra verificación del Dictionary si no existe de la manera que estoy esperando.

Utilizando el método anterior no funcionó para mí, porque el compilador ahoga en conseguir KeyValuePair.Value de KeyValuePair<>?, por lo que es mejor utilizar default(KeyValuePair<>) como se ve en esta pregunta + respuestas. The default for KeyValuePair

Cuestiones relacionadas