2009-05-07 5 views
12

Ho il seguente:Perché nullable KeyValuePair <,> non ha alcuna proprietà chiave?

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' 

Sono sicuro che c'è qualche ragione per questo, come posso vedere che il tipo è nullable. È perché sto tentando di accedere alla chiave quando null potrebbe causare problemi?

+0

Non getta, si ottiene un errore di compilazione. –

risposta

22

Prova a modificare:

myKVP.Value.Key; 

Qui è una versione ridotta System.Nullable<T>:

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

Poiché la proprietà Value è di tipo T è necessario utilizzare la proprietà Value per arrivare alla avvolto Digita l'istanza con cui stai lavorando.

Edit: Vorrei suggerire che si controlla la proprietà HasValue del vostro tipo annullabile prima di utilizzare il Value.

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

eccellente, grazie, non molto intuitivo è? – Matt

+0

È un po 'strano a prima vista, ma una volta capito come funziona sotto le coperte ha perfettamente senso. :) –

+0

quindi suppongo che il nullable abbia un valore e che in questo caso il valore (se esiste) sia un KeyValuePair. quindi in questo caso myKVP è un valore nullo e la sua proprietà value è KeyValuePair? – Matt

0

Questo perché tipi nullable possono essere assegnati valore nullo o il valore effettivo, e quindi si deve chiamare ".value" su tutti i tipi nullable. ".value" restituirà il valore sottostante o lancia un System :: InvalidOperationException.

È anche possibile chiamare ".HasValue" sul tipo annullabile per assicurarsi che al valore sia assegnato un valore.