2009-05-07 16 views
12

Aşağıdakilere sahibim:Niçin kilitlenebilir KeyValuePair <,>'in anahtar özelliği yoktur?

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' 

Eminim bunun nedeni niçin görülebilir olduğunu görebildiğim için bunun bir nedeni var. Xzx12'nin kötü şeylerin meydana gelmesine neden olabileceğinden, bu anahtara erişmeye çalıştığım için mi?

+0

Atma, bir derleme hatası alırsınız. –

cevap

22

yerine bu deneyin: sarılı ulaşmak için Value özelliğini kullanmanız gerekir TValue malın türü olduğundan

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

:

İşte
myKVP.Value.Key; 

tam olmayan bir System.Nullable<T> sürümüdür ile çalıştığınız tür örneği.

Düzenleme: Sana öncesinde Value kullanarak için olabilen türün HasValue özelliğini kontrol etmenizi öneririz. null tipleri, boş değer ya da gerçek değer atanabilir dolayısıyla tüm null türleri üzerinde ".value" aramak zorunda çünkü

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

mükemmel, teşekkürler, çok sezgisel değil mi? – Matt

+0

İlk bakışta biraz garip ama kapakların altında nasıl çalıştığını anladıktan sonra mükemmel bir his veriyor. :) –

+0

sanırım, nullable bir değere sahiptir ve bu durumda değer (varsa) bir KeyValuePair'dir. Bu durumda myKVP bir null ve değerli bir özellik olan KeyValuePair IS? – Matt

0

budur. ".value", alttaki değeri döndürür veya System :: InvalidOperationException atar.

Gerçek türüne atanan değer olduğundan emin olmak için ".HasValue" değerini null türünde de kullanabilirsiniz.

İlgili konular