नमूना कार्यक्रम के लिए के रूप में अशक्त नहीं है:प्रकार एक उचित मूल्य
type public MyClass(reasonForLiving:string) =
member x.ReasonForLiving with get() = reasonForLiving
let classFactory() = MyClass("up to you")
let live() =
let instance = classFactory()
if instance = null then raise(System.Exception("null is not living... that's why OO languages die from bugs"))
instance
मैं त्रुटि मिलती है "प्रकार 'MyClass' एक उचित मूल्य के रूप में अशक्त नहीं है" जब मैं इस वर्ग का उपयोग करने के लिए जाना निहित रूप से टाइप किए गए कार्यों के वापसी मूल्य के रूप में और इसकी तुलना शून्य (सी # निर्भरता इंजेक्शन के साथ संगतता आवश्यकताओं के बी/सी की तुलना में मैं एफ # विकल्प प्रकारों पर भरोसा नहीं कर सकता)।
मैं आसानी से करने के लिए अशक्त जांच बदलकर इसे ठीक कर सकते हैं:
if instance :> obj = null then
हालांकि, मैं ("लगता है") यह पूरी तरह से "गलत" है। विशेष रूप से जब मैं मानता हूं कि MyClass एक संदर्भ प्रकार है जिसे बॉक्स करने की आवश्यकता नहीं है (सी # पृष्ठभूमि से बोलना)।
मैंने "एफ # वैल्यू प्रतिबंध" के बारे में पढ़ा है और यह किस तरह के अनुमान को प्रभावित करता है, लेकिन मुझे लगता है कि यह इस परिदृश्य पर कैसे लागू होता है।
प्रश्न: क्या ऐसा करने का कोई और तरीका है?
एक तरफ # 1: मैं त्रुटि हो रही है की एक सरल तरीका ...
type public MyClass(reasonForLiving:string) =
member x.ReasonForLiving with get() = reasonForLiving
let nullMyClass : MyClass = null
एक तरफ # 2 पाया: मैं बिना सोचे System.Nullable का प्रयास किया ... MyClass एक है संदर्भ प्रकार और एक मान प्रकार (संरचना) नहीं है जो Nullable < _> आवश्यक है। तो, बस मुझे आश्वस्त करता है कि मैं वास्तव में संदर्भ प्रकार से निपट रहा हूं और मुझे आश्चर्यचकित करता है कि एक ऑब्जेक्ट कास्ट अचानक क्यों काम करता है।
अपडेट: किसी भी दिलचस्पी के लिए, मैंने इसे सामान्य सेवा लोकेटर के लिए नीचे दिए गए तीन कार्यों के साथ एक समाधान के रूप में उपयोग किया।
let private getServiceLocator() =
try Some(Microsoft.Practices.ServiceLocation.ServiceLocator.Current)
with | _ -> None
let private getService serviceFactory =
let serviceLocator = getServiceLocator()
let service = match serviceLocator with
| None -> serviceFactory()
| _ ->
match serviceLocator.Value.GetInstance<'a>() with
| null -> serviceFactory()
| svc -> svc
match service with
| null -> None
| _ -> Some(service)
let private getRequiredService serviceFactory =
let service = getService serviceFactory
match service with
| None -> raise(MissingServiceException(""))
| _ -> service.Value
दोह! इसे देखने के बाद, मैंने इसे एमएसडीएन "नल वैल्यूज़ (एफ #)" पर तीसरे वाक्य से मान्यता दी: http://msdn.microsoft.com/en-us/library/dd233197(v=vs.110).aspx –
बस जोड़ें - यदि आप इंटरऑप –
जॉन नहीं करते हैं तो यह 'विकल्प' टी का उपयोग करने के लिए अधिक मूर्खतापूर्ण है - हाँ, मैंने विकल्प का उपयोग करने में सक्षम नहीं होने का उल्लेख किया है। तो, सी # के संपर्क में आने वाले प्रत्येक वर्ग को सी # देव के रूप में काम करने के लिए '[] 'की आवश्यकता होगी ... :( –