F #

2010-09-02 10 views
5

में Nullablle <> 'और "null" मैं F # से XNA ढांचे में फ़ंक्शंस कॉल कर रहा हूं जो Nullable मान स्वीकार करता है। अब, सी # में, आप बस कॉल करेंगे:F #

foo(arg1, arg2, null, arg4) 

अब, मैंने एफ # में कोशिश की, लेकिन इसे पसंद नहीं है। यह कहता है: "त्रुटि 9 टाइप बाधा मेल नहीं है। प्रकार 'ए सिस्टम के साथ संगत नहीं है। अनुपयोगी प्रकार' System.Nullable 'में उचित मूल्य के रूप में' शून्य 'नहीं है।"

मुझे समझ में आता है कि यह क्यों हो रहा है, तरह का, लेकिन यह वास्तव में असुविधाजनक लगता है। मैं अब कर रहा हूं, जीवन को आसान बनाने के लिए, बार-बार (Nullable<Rectangle>)null टाइप करने की बजाए जब मैं फ़ंक्शन को कॉल करता हूं, मैंने अभी let nullRect = (Nullable<Rectangle>)null किया है, और nullRect का उपयोग करें। यह वास्तव में बेवकूफ लगता है, खासकर जब से मुझे ऐसा करने के लिए हर शून्य प्रकार के लिए बातचीत करना होगा। क्या इसे संभालने के लिए एक बेहतर, अधिक मूर्ख तरीका है?

उत्तर

3

यहाँ मैं करना चाहते हैं क्या करना है:

[<GeneralizableValue>] 
let nl<'a when 'a : struct 
      and 'a : (new : unit -> 'a) 
      and 'a :> System.ValueType> : System.Nullable<'a> = 
    unbox null 

अब आप nl उपयोग कर सकते हैं भी आप null से पहले इस्तेमाल किया गया होगा।

संपादित

टॉमस नोटों के रूप में, यह बहुत अधिक संक्षेप में लिखा जा सकता है के रूप में:

let nl = System.Nullable<_>() 
+1

साइड-नोट के रूप में, इसे '[] को सरलीकृत किया जा सकता है nl = System.Nullable <_>() '। एफ # शेष हस्ताक्षर का अनुमान लगा सकता है। –

+0

यह वास्तव में साफ है! मुझे अभी तक टॉमस के संक्षेप को आजमाने का मौका नहीं मिला है। सलाह के लिये धन्यवाद! – Perrako

+0

@ टोमास - अच्छी पकड़, यह बहुत अच्छी लग रही है। – kvb

3

आप, KVB के बहुत चालाक जवाब का उपयोग करने के कई मामलों आप छोड़ सकते हैं में नहीं करना चाहते हैं विशिष्ट प्रकार और केवल Nullable<_>() का उपयोग करें - एफ # अनुमान लगा सकता है कि आपके किस प्रकार का शून्य है।

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

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