2011-01-16 5 views
29

मैं निम्नलिखित समारोह बनाया है:'System.Action <object>' को 'विधि समूह' से कनवर्ट नहीं कर सकता त्रुटि

public void DelegatedCall(Action<Object> delegatedMethod) 

और निम्न विधि परिभाषित

public void foo1(String str) { } 

हालांकि, जब मैं करने की कोशिश foo1 साथ DelegateCall फोन:

DelegatedCall(foo1); 

... मैं वें मिल ई निम्नलिखित संकलक त्रुटि:

Argument 1: cannot convert from 'method group' to 'System.Action<object>'

इस त्रुटि का कारण क्या है और मैं इसे कैसे ठीक कर सकता हूं? दुर्भाग्य से, foo1 से Action कास्टिंग एक विकल्प नहीं है।

+0

संबंधित: [सी # में एक विधि समूह क्या है?] (Http://stackoverflow.com/q/886822/1497596) – DavidRR

उत्तर

20

DelegatedCall एक ऐसे प्रतिनिधि की अपेक्षा करता है जो object को तर्क के रूप में लेता है। लेकिन आपका कार्य foo1 है कि आप DelegatedCall पर जा रहे हैं केवल string तर्क से निपट सकते हैं। इसलिए, रूपांतरण टाइप-सुरक्षित नहीं है और इस प्रकार यह संभव नहीं है।

इनपुट पैरामीटर contra-variant रहे हैं, लेकिन अपने कोड की जरूरत है covariance

आप DelegatedCall सामान्य बना सकते हैं (Difference between Covariance & Contra-variance देखें।):

DelegatedCall<T>(Action<T> action) 

... या है यह किसी भी प्रतिनिधि ले:

DelegatedCall(Delegate action) 

लेकिन फिर लागू करने यह बदसूरत है और प्रतिबिंब की आवश्यकता है। यह यह भी सत्यापित नहीं करता है कि फ़ंक्शन में संकलन-समय पर केवल एक पैरामीटर है।

+0

क्या आप इस तरह के कोड बना सकते हैं? मैं DelegateCall को एक फ़ंक्शन प्राप्त करने की क्षमता प्राप्त करना चाहता हूं जो किसी भी प्रकार का कोई पैरामीटर प्राप्त करता है (स्ट्रिंग, बूल, सूची ...) – Jonathan

+2

क्या आप इसे सामान्य बना सकते हैं? – CodesInChaos

+0

दुर्भाग्य से कोई – Jonathan

9

भिन्नता इस तरह से काम नहीं करती है; आपको

DelegatedCall(obj => foo1((string)obj)); 

4.0 में भी यह विश्वास नहीं करेगा कि प्रत्येक ऑब्जेक्ट एक स्ट्रिंग है।

ध्यान दें कि अगर यह foo1(object) और Action<string> (अर्थात दूसरी तरह के आसपास) था यह शायद, (4.0 में) काम करेगा के बाद से हर स्ट्रिंग एक वस्तु है।

+1

दूसरी तरफ 4.0 से पहले भी काम करता है। एक विधि समूह भिन्नता से कनवर्ट करते समय भी पिछले संस्करणों में उपलब्ध था। – CodesInChaos

+0

ठीक है वैसे भी मैं यह काम कर सकता हूं: मैं DelegateCall को किसी फ़ंक्शन को प्राप्त करने की क्षमता प्राप्त करना चाहता हूं जो किसी भी प्रकार का कोई पैरामीटर प्राप्त करता है (स्ट्रिंग, बूल, सूची ...)। किसी भी मदद की सराहना की जाएगी – Jonathan

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