सबसे पहले, मुझे सिर्फ यह कहना चाहिए कि जॉन का जवाब सही है। यह कल्पना के सबसे बालों वाले हिस्सों में से एक है, जो पहले सिर में गोता लगाने के लिए जॉन पर अच्छा था।
दूसरा, मुझे यह कहने दें कि यह पंक्ति:
एक अंतर्निहित समूह एक विधि समूह से एक संगत प्रतिनिधि प्रकार में मौजूद है
(जोर दिया गया) गहरा भ्रामक और दुर्भाग्यपूर्ण है। मैं यहाँ "संगत" शब्द को हटाने के बारे में मैड्स से बात करूंगा।
इसका कारण भ्रामक और दुर्भाग्यपूर्ण है क्योंकि ऐसा लग रहा है कि यह खंड 15.2, "प्रतिनिधि संगतता" कह रहा है। धारा 15.2 में विधियों और प्रतिनिधि प्रकारों के बीच संगतता संबंध का वर्णन किया गया है , लेकिन यह विधि समूहों और प्रतिनिधि प्रकारों की परिवर्तनीयता का प्रश्न है , जो अलग है।
अब जब हमें वह मिल गया है, तो हम कल्पना के खंड 6.6 से चल सकते हैं और देख सकते हैं कि हमें क्या मिलता है।
ओवरलोड रिज़ॉल्यूशन करने के लिए हमें पहले यह निर्धारित करना होगा कि कौन से ओवरलोड लागू उम्मीदवार हैं । यदि सभी तर्क औपचारिक पैरामीटर प्रकारों के लिए परिवर्तनीय हैं, तो एक उम्मीदवार लागू होता है। अपने कार्यक्रम के इस सरलीकृत संस्करण पर विचार करें:
class Program
{
delegate void D1();
delegate string D2();
static string X() { return null; }
static void Y(D1 d1) {}
static void Y(D2 d2) {}
static void Main()
{
Y(X);
}
}
तो चलो लाइन के माध्यम से लाइन के माध्यम से चलते हैं।
एक अंतर्निहित समूह एक विधि समूह से एक संगत प्रतिनिधि प्रकार में मौजूद है।
मैंने पहले ही चर्चा की है कि "संगत" शब्द यहाँ कैसे दुर्भाग्यपूर्ण है। आगे बढ़ते रहना। Y (X) पर ओवरलोड रिज़ॉल्यूशन करते समय हम सोच रहे हैं कि क्या विधि समूह X D1 में परिवर्तित होता है? क्या यह D2 में परिवर्तित होता है?
एक प्रतिनिधि प्रकार डी और एक अभिव्यक्ति ई को देखते हुए जिसे एक विधि समूह के रूप में वर्गीकृत किया गया है, एक अंतर्निहित रूपांतरण ई से डी तक मौजूद है यदि ई में कम से कम एक विधि है जो लागू होता है [...] पैरामीटर के उपयोग द्वारा निर्मित तर्क सूची के लिए। डी के प्रकार और संशोधन, जैसा कि निम्नलिखित में वर्णित है।
अब तक सब ठीक है। X में D1 या D2 की तर्क सूचियों के साथ लागू एक विधि हो सकती है।
विधि समूह E से किसी प्रतिनिधि प्रकार D में रूपांतरण का संकलन-समय अनुप्रयोग निम्नलिखित में वर्णित है।
यह लाइन वास्तव में कुछ भी दिलचस्प नहीं कहती है।
ध्यान दें कि E से D तक एक निहित रूपांतरण का अस्तित्व इस बात की गारंटी नहीं देता है कि रूपांतरण का संकलन-समय अनुप्रयोग त्रुटि के बिना सफल होगा।
यह रेखा आकर्षक है। इसका मतलब है कि निहित रूपांतरण हैं जो मौजूद हैं, लेकिन जो त्रुटियों में बदल रहे हैं! यह C # का एक विचित्र नियम है। एक पल को खोदने के लिए, यहाँ एक उदाहरण है:
void Q(Expression<Func<string>> f){}
string M(int x) { ... }
...
int y = 123;
Q(()=>M(y++));
एक एक्सप्रेशन ऑपरेशन एक अभिव्यक्ति ट्री में अवैध है। हालाँकि, लैम्बडा अभी भी अभिव्यक्ति ट्री प्रकार के लिए परिवर्तनीय है, भले ही रूपांतरण कभी भी उपयोग किया जाता है, यह एक त्रुटि है! यहाँ सिद्धांत यह है कि हम बाद में एक अभिव्यक्ति के पेड़ में क्या जा सकते हैं के नियमों को बदलना चाहते हैं; उन नियमों को बदलने से सिस्टम के प्रकार के नियम नहीं बदलने चाहिए । हम आपको अपने कार्यक्रमों को अब अस्पष्ट बनाने के लिए मजबूर करना चाहते हैं , ताकि जब हम भविष्य में अभिव्यक्ति के पेड़ों के नियमों को बदलकर उन्हें बेहतर बना सकें, तो हम अधिभार संकल्प में टूटने वाले बदलावों का परिचय नहीं देते हैं ।
वैसे भी, यह इस तरह के विचित्र नियम का एक और उदाहरण है। ओवरलोड रिज़ॉल्यूशन के उद्देश्यों के लिए रूपांतरण मौजूद हो सकता है, लेकिन वास्तव में उपयोग करने के लिए एक त्रुटि हो सकती है। हालांकि वास्तव में, यह बिल्कुल वैसी स्थिति नहीं है जैसी हम यहां हैं।
आगे बढ़ते रहना:
E (A) [A] [...] के तर्क विधि सूची के अनुरूप एक एकल विधि M का चयन किया जाता है। तर्क सूची A एक अभिव्यक्ति की एक सूची है, जिसे प्रत्येक को चर के रूप में वर्गीकृत किया गया है [...] -पार्टी-डी की सूची।
ठीक है। इसलिए हम डी 1 के संबंध में एक्स पर अधिभार संकल्प करते हैं। डी 1 की औपचारिक पैरामीटर सूची खाली है, इसलिए हम एक्स () और आनंद पर अधिभार संकल्प करते हैं, हम एक विधि "स्ट्रिंग एक्स ()" पाते हैं जो काम करता है। इसी तरह, डी 2 की औपचारिक पैरामीटर सूची खाली है। फिर, हम पाते हैं कि "स्ट्रिंग एक्स ()" एक विधि है जो यहां भी काम करती है।
यहाँ सिद्धांत यह है कि निर्धारण विधि समूह परिवर्तनीयता को अधिभार संकल्प का उपयोग करते हुए विधि समूह से एक विधि का चयन करने की आवश्यकता होती है , और अधिभार संकल्प विभिन्न प्रकारों पर विचार नहीं करता है ।
यदि एल्गोरिथ्म [...] एक त्रुटि पैदा करता है, तो एक संकलन-समय त्रुटि उत्पन्न होती है। अन्यथा एल्गोरिथ्म डी के रूप में मापदंडों की एक ही संख्या होने वाले एक सबसे अच्छी विधि एम का उत्पादन करता है और रूपांतरण मौजूद माना जाता है।
विधि समूह एक्स में केवल एक ही विधि है, इसलिए यह सबसे अच्छा होना चाहिए। हम सफलतापूर्वक साबित कर दिया है कि एक रूपांतरण मौजूद एक्स से डी 1 के लिए और एक्स से डी 2 के लिए।
अब, क्या यह पंक्ति प्रासंगिक है?
चयनित विधि M को प्रतिनिधि प्रकार D के साथ संगत होना चाहिए, या अन्यथा, एक संकलन-समय त्रुटि उत्पन्न होती है।
दरअसल, नहीं, इस कार्यक्रम में नहीं। हम कभी भी इस रेखा को सक्रिय नहीं कर पाए। क्योंकि, याद रखें, हम यहाँ क्या कर रहे हैं Y (X) पर अधिभार संकल्प करने की कोशिश कर रहे हैं। हमारे पास दो उम्मीदवार Y (D1) और Y (D2) हैं। दोनों लागू हैं। कौन सा बेहतर है ? विनिर्देश में कहीं भी हम इन दो संभावित रूपांतरणों के बीच विश्वासघात का वर्णन नहीं करते हैं ।
अब, कोई निश्चित रूप से यह तर्क दे सकता है कि एक वैध रूपांतरण एक त्रुटि पैदा करने वाले से बेहतर है। इसके बाद प्रभावी रूप से कहा जा सकता है, इस मामले में, कि अधिभार संकल्प रिटर्न प्रकारों पर विचार करता है, जो कि हम से बचना चाहते हैं। फिर सवाल यह है कि कौन सा सिद्धांत बेहतर है: (1) अपरिवर्तनीय बनाए रखें कि अधिभार संकल्प रिटर्न प्रकारों पर विचार नहीं करता है, या (2) एक रूपांतरण लेने की कोशिश करता है जिसे हम जानते हैं कि हम जो नहीं जानते हैं उस पर काम करेंगे?
यह एक निर्णय कॉल है। साथ lambdas , हम करते हैं , रूपांतरण के इन प्रकार में वापसी प्रकार पर विचार खंड 7.4.3.3 में:
E एक अनाम फ़ंक्शन है, T1 और T2 समान पैरामीटर सूचियों के साथ प्रतिनिधि प्रकार या अभिव्यक्ति ट्री प्रकार हैं, एक अनुमानित वापसी प्रकार X उस पैरामीटर सूची के संदर्भ में ई के लिए मौजूद है, और निम्न में से एक है:
T1 में वापसी प्रकार Y1 है, और T2 में वापसी प्रकार Y2 है, और X से Y1 में रूपांतरण X से Y2 में रूपांतरण से बेहतर है
T1 में एक वापसी प्रकार Y है, और T2 वापस लौटने वाला है
यह दुर्भाग्यपूर्ण है कि विधि समूह रूपांतरण और लंबोदर रूपांतरण इस संबंध में असंगत हैं। हालांकि, मैं इसके साथ रह सकता हूं।
वैसे भी, हमारे पास यह निर्धारित करने के लिए कोई "शर्त" नहीं है कि कौन सा रूपांतरण बेहतर है, X से D1 या X से D2। इसलिए हम वाई (एक्स) के संकल्प पर एक अस्पष्टता त्रुटि देते हैं।