मैंने उन चीज़ों के कुछ उदाहरण देखे हैं जो काम करते हैं और सी # में लैम्ब्डा कार्यों और अज्ञात प्रतिनिधियों से निपटने के दौरान काम नहीं करते हैं। यहाँ क्या चल रहा है?प्रतिनिधि/लैम्ब्डा टाइपिंग और जबरदस्ती कैसे काम करते हैं?
class Test : Control {
void testInvoke() {
// The best overloaded method match for 'Invoke' has some invalid arguments
Invoke(doSomething);
// Cannot convert anonymous method to type 'System.Delegate' because it is not a delegate type
Invoke(delegate { doSomething(); });
// OK
Invoke((Action)doSomething);
// OK
Invoke((Action)delegate { doSomething(); });
// Cannot convert lambda expression to type 'System.Delegate' because it is not a delegate type
Invoke(() => doSomething());
// OK
Invoke((Action)(() => doSomething()));
}
void testQueueUserWorkItem() {
// The best overloaded method match for 'QueueUserWorkItem' has some invalid arguments
ThreadPool.QueueUserWorkItem(doSomething);
// OK
ThreadPool.QueueUserWorkItem(delegate { doSomething(); });
// The best overloaded method match for 'QueueUserWorkItem' has some invalid arguments
ThreadPool.QueueUserWorkItem((Action)doSomething);
// No overload for 'doSomething' matches delegate 'WaitCallback'
ThreadPool.QueueUserWorkItem((WaitCallback)doSomething);
// OK
ThreadPool.QueueUserWorkItem((WaitCallback)delegate { doSomething(); });
// Delegate 'WaitCallback' does not take '0' arguments
ThreadPool.QueueUserWorkItem(() => doSomething());
// OK
ThreadPool.QueueUserWorkItem(state => doSomething());
}
void doSomething() {
// ...
}
}
वैसे यह बहुत सारे उदाहरण हैं। मुझे लगता है कि मेरे सवालों का इस प्रकार हैं:
क्यों
Invoke
हमेशा एक लैम्ब्डा समारोह या एक अनाम प्रतिनिधि मना करता है, अभी तकThreadPool.QueueUserWorkItem
ठीक करता है?क्या बिल्ली "अज्ञात विधि को 'सिस्टम' डिलीगेट 'टाइप करने के लिए परिवर्तित नहीं कर सकता क्योंकि यह एक प्रतिनिधि प्रकार नहीं है" वैसे भी?
ThreadPool.QueueUserWorkItem
कोई पैरामीटर के साथ एक अज्ञात प्रतिनिधि को स्वीकार क्यों करता है, लेकिन कोई पैरामीटर के साथ लैम्ब्डा अभिव्यक्ति नहीं है?
और मैंने सोचा कि मैं प्रतिनिधियों और lambdas समझा। मैं बहुत मूर्ख था। – recursive
हमेशा के लिए अच्छी चीजें, +1 के लिए +1 ... ... एकमात्र विशेषता है जो लैम्ब्डा अभिव्यक्ति नहीं करती है। " – Ani
@recursive, यदि आप और जानना चाहते हैं, अभिव्यक्ति पेड़ों पर पढ़ें। लैम्ब्डा अभिव्यक्तियों के बारे में दिलचस्प बात यह है कि वे वास्तव में _expressions_ हैं, जो व्यक्त किए जा रहे हैं के लिए एक समृद्ध वर्णनात्मक मॉडल के साथ, और प्रतिनिधि प्रतिनिधि पैरामीटर को तर्क पारित करने के लिए केवल एक वाक्य रचनात्मक शॉर्टकट नहीं है। यह वही है जो LINQ से SQL को होने की अनुमति देता है। http://msdn.microsoft.com/en-us/library/bb397951.aspx –