2015-07-30 5 views
14

बस इस आजआप गतिशील पैरामीटर के साथ एनन फ़ंक्शन का उपयोग क्यों नहीं कर सकते?

एक अनाम समारोह या विधि समूह एक गतिशील बाध्य आपरेशन के एक घटक मूल्य के रूप में नहीं किया जा सकता का सामना किया। आप क्योंकि कैसे एक विस्तार विधि का उपयोग नहीं कर सकते हैं -

जब

static R ifNotNull<R>(dynamic o, Func<dynamic, R> returnFunc, R otherwise) { 
    return ReferenceEquals(null, o) ? otherwise : returnFunc(o); 
} 

करते हैं और साथ

dynamic firstAddress = ...; 
return ifNotNull<string>(firstAddress, (a) => a.address_1, null) 

अब गतिशीलता पर सीमाओं के सबसे मेरे लिए कोई मतलब इसका इस्तेमाल करने की कोशिश कर रहा संकलक यह तय करना चाहता है कि इसे किस स्थिर करने के लिए संकलित किया गया है? लेकिन मुझे यह यहाँ नहीं मिला है। भ्रम कहां आता है? सीमा वास्तव में क्या है?

+2

वहाँ शायद एक 'returnFunc' में संकलन के साथ' (क) => a.address_1' एक मुद्दा है।इस प्रश्न का उत्तर देने के लिए एरिक लिपर्ट की प्रतीक्षा :-) – dasblinkenlight

+0

वैसे, आपके कोड और 'स्थिर आर ifNotNull (ऑब्जेक्ट ओ, फनक वापसी फ़नक, आर अन्यथा) {...}' के बीच क्या अंतर है? – dasblinkenlight

+0

@dasblinkenlight ठीक वही जो मैं सोच रहा था। 3..2.1.1 में लिपर्ट के लिए तैयार करें ... –

उत्तर

11

lambaa => a.address_1 का स्थिर प्रकार क्या है? आप कह सकते हैं कि यह Func<dynamic, dynamic> है। लेकिन याद रखें:

एक लैम्ब्डा अभिव्यक्ति एक अनाम कार्य है जिसे आप पर प्रतिनिधियों या अभिव्यक्ति वृक्ष प्रकारों का उपयोग कर सकते हैं।

तो शायद यह Expression<Func<dynamic, dynamic>> है। एक लम्दा में स्वयं का एक स्थिर प्रकार नहीं होता है।

अब सामान्य रूप से टाइप करें यह अनुमान लगाएगा कि आप एक समारोह में लम्बा पास कर रहे हैं जो Func लेता है और इसे संकलित समय पर एक प्रतिनिधि में परिवर्तित कर दिया जाएगा। हालांकि जब आप गतिशील तर्क the method call is dispatched dynamically के साथ कॉल कर रहे हैं।

यदि आपके पास गतिशील तर्क के साथ एक विधि कॉल है, तो यह गतिशील रूप से प्रेषित किया जाता है। रनटाइम बाध्यकारी के दौरान, आपके तर्कों के सभी स्थिर प्रकार (जोर मेरा) ज्ञात हैं, और गतिशील तर्कों के लिए उनके वास्तविक मानों के आधार पर तर्कों को चुना जाता है।

तो तथ्य आपके विधि एक Func खाते को शामिल नहीं किया जाता है लेता है कि, the actual method call isn't determined until runtime के बाद से इसलिए कोई प्रकार निष्कर्ष है।

इस संकलित करने के लिए आप के रूप में नीचे एक Func<dynamic, string> करने के लिए अपने लांबा कास्ट करने के लिए होगा प्राप्त करने के लिए:

return ifNotNull<string>(firstAddress, new Func<dynamic, string>((a) => a.address_1), null); 

अब आप अपने lamda के स्थिर प्रकार जाना जाता है।

+0

ठोस उत्तर के लिए धन्यवाद। यह समझ आता है। हालांकि मैं अभी भी थोड़ी देर में हूं, मुझे एक लिपटे जवाब नहीं मिला ... –

1

मेरा मतलब था कि आपको lambda विधि को अपेक्षित अभिव्यक्ति के लिए डालना होगा। तो यह ठीक काम करेगा।

इस तरह

:

return ifNotNull(firstAddress, (Func<dynamic, string>)((a) => a.address_1), null); 
संबंधित मुद्दे

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