सामान्य परिस्थितियों में, एफ # कार्यों को new DelegateType
पर कॉल करके और कार्य में एक तर्क के रूप में गुजरकर प्रतिनिधियों में परिवर्तित किया जा सकता है। लेकिन जब प्रतिनिधि में byref
पैरामीटर होता है, तो यह सीधे संभव नहीं है। उदाहरण के लिए कोड:बाईफ के साथ कोई फ़ंक्शन सीधे प्रतिनिधि को क्यों परिवर्तित नहीं किया जा सकता है?
type ActionByRef<'a> = delegate of 'a byref -> unit
let f (x:double byref) =
x <- 6.0
let x = ref 42.0
let d = new ActionByRef<_>(f)
संकलन, तो निम्न त्रुटि दे रही है नहीं होगा:
This function value is being used to construct a delegate type whose signature includes a byref argument. You must use an explicit lambda expression taking 1 arguments.
let d = new ActionByRef<_>(fun x -> f(&x))
काम करता है का उपयोग करने के कोड को संशोधित करने, त्रुटि के बाद। लेकिन मेरा सवाल है: यह क्यों जरूरी है? एफ # नामित फ़ंक्शन से इस प्रतिनिधि को रूपांतरण क्यों नहीं देगा, लेकिन लैम्ब्डा से रूपांतरण ठीक है?
another question पर शोध करते समय मैं इस व्यवहार पर आया था। मुझे एहसास है कि byref
केवल अन्य नेट भाषाओं के साथ संगतता के लिए है।
दिलचस्प, मैंने इसके बारे में नहीं सोचा था। एक नाइटपिक, मुझे लगता है कि 'byref'' ref' की तरह है, न कि 'बाहर'। – svick
@ एसविक - आप सही हैं - असल में, आईएल स्तर पर, ध्वज 'रेफरी' है और सी # 'आउट 'बिल्कुल मौजूद नहीं है ... –
दाएं, सी # का' आउट' वास्तव में' रेफरी 'प्लस है 'System.Runtime.InteropServices.Out' विशेषता। – ildjarn