दूसरों ने पहले से ही बताया है कि असीम रूप से कई संभावित प्रतिनिधि प्रकार हैं जो आपके पास हो सकते हैं; ऐसी क्या खास बात के बारे में क्या है Func
कि यह बजाय डिफ़ॉल्ट होने के लिए योग्य है Predicate
या Action
या किसी अन्य संभावना? और, लंबोदर के लिए, यह क्यों स्पष्ट है कि अभिव्यक्ति के पेड़ के रूप के बजाय प्रतिनिधि प्रतिनिधि चुनने का इरादा है?
लेकिन हम कह सकते हैं कि Func
यह विशेष है, और यह है कि लैंबडा या अनाम विधि का अनुमानित प्रकार किसी चीज का फन है। हमें अभी भी सभी प्रकार की समस्याएं हैं। निम्नलिखित मामलों के लिए आप किस प्रकार का अनुमान लगाना चाहेंगे?
var x1 = (ref int y)=>123;
ऐसा कोई Func<T>
प्रकार नहीं है जो किसी भी चीज़ को लेता है।
var x2 = y=>123;
हम औपचारिक पैरामीटर के प्रकार को नहीं जानते हैं, हालांकि हम रिटर्न को जानते हैं। (या हम करते हैं? वापसी int है? लंबी? छोटी बाइट?)
var x3 = (int y)=>null;
हम वापसी प्रकार नहीं जानते, लेकिन यह शून्य नहीं हो सकता। वापसी प्रकार कोई भी संदर्भ प्रकार या कोई अशक्त मान प्रकार हो सकता है।
var x4 = (int y)=>{ throw new Exception(); }
फिर, हम रिटर्न प्रकार नहीं जानते हैं, और इस बार यह शून्य हो सकता है।
var x5 = (int y)=> q += y;
क्या यह एक शून्य-रिटर्न स्टेटमेंट लंबोदा या कुछ और है जो कि क्यू को सौंपा गया मान लौटाता है? दोनों कानूनी हैं; हमें कौन सा चुनना चाहिए?
अब, आप कह सकते हैं, ठीक है, बस उन सुविधाओं में से किसी का समर्थन नहीं करते। बस "सामान्य" मामलों का समर्थन करें जहां प्रकारों पर काम किया जा सकता है। यह मदद नहीं करता है। यह कैसे मेरे जीवन को आसान बनाता है? यदि सुविधा कभी-कभी काम करती है और कभी-कभी विफल हो जाती है, तो मुझे अभी भी उन सभी असफल स्थितियों का पता लगाने के लिए कोड लिखना होगा और प्रत्येक के लिए एक सार्थक त्रुटि संदेश देना होगा । हमें अभी भी उस सभी व्यवहार को निर्दिष्ट करना है, दस्तावेज करना है, इसके लिए परीक्षण लिखना है, और इसी तरह। यह एक बहुत महंगी सुविधा है जो उपयोगकर्ता को शायद आधा दर्जन कीस्ट्रोक्स बचाता है। हमारे पास भाषा को बेहतर तरीके से जोड़ने का बेहतर तरीका है कि एक फीचर के लिए परीक्षण के मामलों को लिखने में बहुत समय खर्च किया जाए जो आधे समय तक काम नहीं करता है और उन मामलों में शायद ही कोई लाभ प्रदान करता है जहां यह काम करता है।
स्थिति जहां यह वास्तव में उपयोगी है:
var xAnon = (int y)=>new { Y = y };
क्योंकि उस चीज़ के लिए कोई "बोलने योग्य" प्रकार नहीं है। लेकिन हमारे पास हर समय यह समस्या होती है, और हम प्रकार घटाने के लिए केवल विधि प्रकार का उपयोग करते हैं:
Func<A, R> WorkItOut<A, R>(Func<A, R> f) { return f; }
...
var xAnon = WorkItOut((int y)=>new { Y = y });
और अब विधि प्रकार का निष्कर्ष यह बताता है कि फंक प्रकार क्या है।
Func<>
16 तर्कों को स्वीकार करता है।