2010-07-10 14 views
5

यह एक वास्तविक समस्या के बजाय सी # सिंटैक्स प्रश्न का अधिक है जिसे हल करने की आवश्यकता है। मान लें कि मेरे पास एक तरीका है जो एक प्रतिनिधि को पैरामीटर के रूप में लेता है। मान लीजिए कि मैं निम्न विधियों में परिभाषित किया है दो:सी # विधियों का सीधे प्रतिनिधि के रूप में उपयोग करने का कोई तरीका है?

void TakeSomeDelegates(Action<int> action, Func<float, Foo, Bar, string> func) 
{ 
    // Do something exciting 
} 

void FirstAction(int arg) { /* something */ } 

string SecondFunc(float one, Foo two, Bar three){ /* etc */ } 

अब अगर मैं FirstAction साथ TakeSomeDelegates और SecondFunc तर्कों के रूप कॉल करने के लिए, जहाँ तक मेरा बता सकता हूँ, मैं कुछ इस तरह करने की ज़रूरत हैं:

TakeSomeDelegates(x => FirstAction(x), (x,y,z) => SecondFunc(x,y,z)); 

लेकिन क्या लैबडा लिखने के बिना आवश्यक प्रतिनिधि हस्ताक्षर फिट करने वाली विधि का उपयोग करने का एक और सुविधाजनक तरीका है? आदर्श रूप से TakeSomeDelegates(FirstAction, SecondFunc) की तरह कुछ, हालांकि स्पष्ट रूप से संकलित नहीं करता है।

+1

"हालांकि स्पष्ट रूप से संकलन नहीं करता है" ... जो संकलित करना चाहिए :) – porges

+0

woops, मुझे वास्तव में पता नहीं है कि मैं पहले क्या कर रहा था, लेकिन ऐसा लगता है कि यह ठीक है। मुझे लगता है कि यह एक सुंदर मूर्ख सवाल है: एस – guhou

+0

अपने समय के लोगों को बर्बाद करने के लिए खेद है ... मुझे यह भी पता नहीं है कि सही के रूप में चिह्नित करने का क्या जवाब है ... क्या मुझे यह प्रश्न अभी हटाना चाहिए? – guhou

उत्तर

4

क्या आप के लिए कुछ कहा जाता है 'method groups' देख रहे है। विधि समूहों के साथ बदलने के बाद

TakeSomeDelegates(x => firstAction(x), (x, y, z) => secondFunc(x, y, z)); 

:

था: इन के साथ, आप इस तरह के रूप में एक पंक्ति lamdas, की जगह ले सकता

TakeSomeDelegates(firstAction, secondFunc); 
+0

इस उत्तर के लिए धन्यवाद! मैं इसे स्वीकार करने जा रहा हूं क्योंकि यह बताता है कि यह क्यों काम करता है :) – guhou

1

संकलक विधि समूहों के नाम स्वीकार करेगा जहां एक प्रतिनिधि की आवश्यकता होती है, जब तक कि यह पता लगाया जा सके कि कौन से ओवरलोड को चुनने के लिए, आपको लैम्ब्डा बनाने की आवश्यकता नहीं है। आप देख रहे सटीक कंपाइलर त्रुटि संदेश क्या है?

+0

ध्यान रखें कि यह केवल 'इन' पैरामीटर को समझ सकता है, यानी यह विधि को वापस करने के प्रकार को हल नहीं कर सकता है: http://stackoverflow.com/questions/3203643/generic-methods-in-net-cannot- उनके पास-वापसी-प्रकार-अनुमानित- –

+0

चूंकि आप रिटर्न प्रकार के आधार पर विधि समूहों को अधिभारित नहीं कर सकते हैं, यह कोई समस्या नहीं है। (आप रिटर्न प्रकार पर 'ऑपरेटर निहित' और 'ऑपरेटर स्पष्ट' ओवरलोड कर सकते हैं, लेकिन इन्हें विधि समूहों के रूप में नामित नहीं किया जा सकता है)। –

2

बस फ़ंक्शन नामों पर अभिभावकों को छोड़ दें।

 TakeSomeDelegates(FirstAction, SecondFunc); 

संपादित करें:

FYI करें के बाद से कोष्ठक VB में वैकल्पिक हैं, वे इस लिखने के लिए ...

TakeSomeDelegates(AddressOf FirstAction, AddressOf SecondFunc) 
0

हाँ, यह विधि समूह कहा जाता है, और अधिक सटीक उदाहरण इसका है ...

static void FirstAction(int arg) { /* something */ } 

static string SecondFunc(float one, Foo two, Bar three) { return ""; } 


Action<int> act1 = FirstAction; 
Func<float, Foo, Bar, string> act2 = SecondFunc; 


TakeSomeDelegates(firstAction, secondFunc); 

इस तरह आप विधि समूह का उपयोग कर सकते हैं।

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

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