2009-05-07 9 views
12

मेरे पास निम्न है:Nullable KeyValuePair <,> में कोई महत्वपूर्ण संपत्ति क्यों नहीं है?

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' 

मुझे यकीन है कि इसके लिए कुछ कारण है क्योंकि मैं देख सकता हूं कि यह प्रकार शून्य है। क्या ऐसा इसलिए है क्योंकि मैं कुंजी का उपयोग करने की कोशिश कर रहा हूं जब null खराब चीजें होने का कारण बन सकता है?

+0

यह फेंक नहीं देता है, आपको एक संकलन त्रुटि मिलती है। –

उत्तर

22

ऐसा करें: के बाद से Value संपत्ति प्रकार का है T आप Value संपत्ति लिपटे पर प्राप्त करने के लिए उपयोग करना चाहिए

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

:

myKVP.Value.Key; 

यहाँ System.Nullable<T> के नीचे छीन संस्करण है उदाहरण के साथ टाइप करें कि आप काम कर रहे हैं।

संपादित करें: मुझे लगता है कि आप Value उपयोग करने से पहले अपने नल प्रकार के HasValue संपत्ति की जाँच का सुझाव देते हैं।

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

उत्कृष्ट, धन्यवाद, बहुत सहज नहीं है? – Matt

+0

यह पहली नज़र में थोड़ा अजीब है लेकिन एक बार जब आप समझते हैं कि यह कवर के तहत कैसे काम करता है तो यह सही समझ में आता है। :) –

+0

तो मुझे लगता है कि, शून्य के पास एक मान है और इस मामले में मान (यदि यह मौजूद है) एक KeyValuePair है। तो इस मामले में myKVP एक नामुमकिन है और इसकी मूल्य संपत्ति KeyValuePair है? – Matt

0

इसका कारण यह है नल प्रकार शून्य मान या वास्तविक मूल्य सौंपा जा सकता है, इसलिए आप सभी नल प्रकार पर कॉल करने के लिए ".Value" है। ".value" अंतर्निहित मान वापस करेगा या सिस्टम :: अवैधऑपरेशन अपवाद को फेंक देगा।

आप वास्तविक प्रकार के लिए असाइन किए गए मान को सुनिश्चित करने के लिए निरर्थक प्रकार पर "हैसवेल्यू" भी कॉल कर सकते हैं।

संबंधित मुद्दे