2009-05-07 13 views
12

Tengo el siguiente:¿Por qué el KeyValuePair nulable <,> no tiene ninguna propiedad clave?

KeyValuePair<string, string>? myKVP; 
// code that may conditionally do something with it 
string keyString = myKVP.Key; 
// throws 'System.Nullable<System.Collections.Generic.KeyValuePair<string,string>>' 
// does not contain a definition for 'Key' 

Estoy seguro de que hay alguna razón para esto ya puedo ver que el tipo es anulable. ¿Es porque estoy tratando de acceder a la clave cuando null podría causar cosas malas?

+0

No tira, se obtiene un error de compilación. –

Respuesta

22

Tal vez puedas probar:

myKVP.Value.Key; 

Aquí es una versión simplificada de System.Nullable<T>:

public struct Nullable<T> where T: struct 
{ 
    public T Value { get; } 
} 

Ya que la propiedad Value es de tipo T debe utilizar la propiedad Value para llegar a la envuelta Escriba la instancia con la que está trabajando.

Editar: Yo sugeriría que compruebe la propiedad HasValue de su tipo anulable antes de usar el Value.

if (myKVP.HasValue) 
{ 
    // use myKVP.Value in here safely 
} 
+0

excelente, gracias, no muy intuitivo ¿verdad? – Matt

+0

Es un poco extraño a primera vista, pero una vez que comprenda cómo funciona debajo de las sábanas, tiene mucho sentido. :) –

+0

así que supongo que el nulo tiene un valor y que en este caso el valor (si existe) es un KeyValuePair. entonces, en este caso myKVP es una propiedad que se puede anular y su valor ES el KeyValuePair? – Matt

0

Esto se debe a tipos anulables pueden ser asignados valor nulo o el valor real, por lo tanto, usted tiene que llamar ".value" en todos los tipos anulables. ".value" devolverá el valor subyacente o lanzará una System :: InvalidOperationException.

También puede llamar a ".HasValue" en tipo anulable para asegurarse de que haya un valor asignado al tipo real.

Cuestiones relacionadas