2011-07-28 13 views
14

के रूप में Lambda \ Anonymous फ़ंक्शन मैं सी # के लिए बहुत नया हूं। बस इसके साथ खेल रहा है। असली उद्देश्य के लिए नहीं।पैरामीटर

void makeOutput(int _param) 
{ 
    Console.WriteLine(_param.ToString()); 
} 

//... 
// Somewhere in a code 
{ 
    makeOutput( /* some not c# code for an example for what do I want */ function : int() { return 0; } ); 
} 

क्या वास्तविक अज्ञात कार्यों का उपयोग करना संभव है (परिणाम लौटने का मतलब है)? इस तरह के

void makeOutput(Func<int> _param) 
{ 
} 

बहुत आम निर्णय है कि के रूप में

मैं प्रतिनिधियों उपयोग करने के लिए इस तरह के

// Somewhere in a code 
{ 
    Func<int> x =() => { return 0; }; 

    makeOutput(x()) 
} 

के रूप में इसके अलावा, मैं विधि पैरामीटर प्रकार बदलना नहीं चाहते हैं नहीं करना चाहती।


सब कुछ ठीक है। मैं बस समझ गया कि मैं असंभव चीजें चाहता था। मैं अज्ञात फ़ंक्शन घोषित करना चाहता था और इसे उसी स्थान पर निष्पादित करना चाहता था। नोट: जेनेरिक रैपर के बिना प्रत्यक्ष घोषणा और प्रत्यक्ष कॉल।

// flash-like (as3) code /// DOES NOT COMPILE 
makeOutput( (function : int(){ return 0; })() ); 
+1

मैं सवाल समझ में नहीं है। क्या आप कुछ psudocode rephrase या उपयोग कर सकते हैं? –

+0

आप पैरामीटर प्रकार क्यों नहीं बदलना चाहते हैं? – SLaks

+0

क्योंकि वह कभी-कभी केवल 'int' का उपयोग करना चाह सकता है? – Vercas

उत्तर

30

हां।
इसे एक प्रतिनिधि कहा जाता है।

प्रतिनिधियों (सामान्य या कम) सामान्य प्रकार हैं; आप उन्हें किसी अन्य प्रकार की तरह फ़ंक्शंस में पास कर सकते हैं।

void makeOutput(Func<int> param) { 
    Console.WriteLine(param()); 
} 

makeOutput(delegate { return 4; }); 
makeOutput(() => { return 4; }); 
makeOutput(() => 4); 

आपका संपादित एड प्रश्न मतलब नहीं है।

सी # टाइप-सुरक्षित है।
यदि विधि पैरामीटर के रूप में कोई फ़ंक्शन नहीं चाहता है, तो आप इसे पैरामीटर के रूप में एक विधि नहीं दे सकते हैं।

5
void makeOutput(Func<int> _param) 
{ 
    makeOutput(_param()); 
} 

void makeOutput(int _param) 
{ 
    Console.WriteLine(_param.ToString()); 
} 

यह चाल कर सकता है!
यह सिमुलेशन तरीका है: ओवरलोडिंग!

+0

@Focker यह मदद करता है? – Vercas

4

मैं इसी तरह की समस्या थी और दोस्त ने मुझे रास्ता दिखाया:

makeOutput((new Func<Int32>(() => { return 0; })).Invoke()); 

आशा इस में मदद मिलेगी