मैं "क्यों नहीं" सवाल पर वापस धक्का क्योंकि पहले, जवाब लगभग संतोषजनक नहीं हैं - आप पहले से ही जवाब मिल गया है "सुविधा वह तरीका नहीं है जो आप इसे चाहते हैं क्योंकि विनिर्देश यह नहीं कहता कि आप क्या कहना चाहते हैं" , जो मुझे लगता है कि एक विशेष रूप से संतोषजनक जवाब नहीं था। दूसरा, डिजाइन टीम को यह बताने का औचित्य नहीं है कि दुनिया वैसी नहीं है जैसा आप चाहते हैं; सुविधाएँ मुफ्त में मौजूद नहीं हैं और फिर उन्हें भाषा से डिज़ाइन किया गया है; इसके बजाय, सुविधाओं को पहले उचित ठहराया जाना चाहिए, और फिर डिज़ाइन किया जाना चाहिए।
तो चलिए आपका "क्यों नहीं" बनाने की कोशिश करते हैं थोड़ा और कुरकुरा सवाल। मौजूदा विशेषता यह है कि "एक सरणी इनिशलाइज़र का उपयोग (a) एक प्रकार के ऑब्जेक्ट कंस्ट्रक्शन के दाईं ओर इनिशियलाइज़ेशन या (b) में समतलों के दाईं ओर किया जा सकता है।" प्रस्तावित विशेषता यह है: "एक सरणी आरंभीकरण का उपयोग एक अभिव्यक्ति के रूप में भी किया जा सकता है"। सवाल यह है कि क्या एरिक प्रस्तावित सुविधा की आलोचना करेंगे?
मेरी पहली आलोचना यह होगी कि यह स्पष्ट नहीं है कि अभिव्यक्ति का प्रकार क्या है। एक वैरिएबल इनिशियलाइज़र में आपके पास वैरिएबल का प्रकार होता है और ऑब्जेक्ट क्रिएशन एक्सप्रेशन में आपके पास ऑब्जेक्ट का प्रकार होता है; इन दोनों से हम निर्मित सरणी के प्रकार को घटा सकते हैं। या तो संकेत के बिना, हमें किस प्रकार की कटौती करनी चाहिए?
C # 1.0 में, जब इस सुविधा को जोड़ा गया था, तो भाषा में बनाए गए कुल प्रकार के शून्य प्रकार के भव्य थे। C # के शुरुआती दिनों में एक डिजाइन सिद्धांत "कोई आश्चर्य नहीं" था, और यह कि कंपाइलर "बहुत स्मार्ट" नहीं था। यदि डेवलपर किसी विशेष प्रकार का होना चाहता है, तो वह अभिव्यक्ति में किसी प्रकार स्पष्ट होना चाहिए। जब आप कहें
new double[] { 1, 2, 3.4 }
यह बहुत स्पष्ट है कि किस प्रकार का इरादा है। उसी प्रकार
new Animal[] { cat, dog, null }
प्रस्तावित विशेषता इस सिद्धांत का उल्लंघन करती है। अभिव्यक्ति का एक प्रकार होना चाहिए, लेकिन यह किसी भी तरह से स्पष्ट नहीं है कि तर्क किस प्रकार का है
M({cat, dog, null})
इसके अलावा: मान लीजिए कि हमारे पास दो ओवरलोड हैं M, जिनमें से एक का एक सरणी लेता है Animalऔर एक का एक सरणी लेता है IPet। कौन सा अधिभार Mलागू है? क्या रूपांतरणों में से एक दूसरे से बेहतर है? तत्वों के प्रकार हैं Catऔर Dog; क्या यह एक प्रकार को कम करने के लिए समझ में आता है जो वहां भी दिखाई नहीं देता है? ये सभी प्रश्न हैं जिन्हें डिजाइन टीम द्वारा विचार किया जाना चाहिए, और ये ऐसे प्रश्न हैं जिनके स्पष्ट उत्तर नहीं हैं। प्रस्तावित विशेषता हमें काफी कम क्रम में गहरे पानी में ले जाती है।
अब, C # 3.0 इस समस्या का हल करता है क्योंकि C # 3.0 में कई विशेषताएं जोड़ी गई हैं जहाँ कंपाइलर डेवलपर की ओर से टाइप करता है। "कोई आश्चर्य नहीं" और "सरल नियम" के बारे में पहले के सिद्धांत लिनक्यू काम करने के लिए आवश्यक अन्य डिजाइन सिद्धांतों के साथ संघर्ष में थे। क्या आपके द्वारा प्रस्तावित फीचर को C # 3.0 में जोड़ा जाना चाहिए?
यह भी हो सकता है। यह सुविधा वास्तव में C # 3.0 में जोड़ी गई थी:
new[] { x, y, z }
एल्गोरिथ्म का उपयोग करके सरणी के प्रकार को संक्रमित करता है: टाइप करने वाले तत्वों के लिए अभिव्यक्तियाँ लें, यह निर्धारित करें कि उन प्रकारों में से कौन सा सबसे सामान्य प्रकार है, जिसके लिए अन्य सभी अभिव्यक्तियाँ परिवर्तनीय हैं, और यदि ऐसा कोई प्रकार मौजूद है, तो उसे चुनें। अन्यथा एक त्रुटि का उत्पादन,
new[]वैकल्पिक बनाने के लिए उस सुविधा को और शिथिल किया जा सकता था । ऐसा नहीं किया गया।
अब, यदि आपने मुझे प्रस्तावित सुविधा की आलोचना करने के लिए C # 3.0 समय-सीमा में मुझसे पूछा था, तो मैंने बताया है कि (1) C # 3.0 संकलक पहले से ही पूरी रिलीज़ के लिए शेड्यूल को खिसकाने के गंभीर खतरे में था, इसलिए हम इसे और न जोड़ें डिजाइन, कार्यान्वयन और परीक्षण के बोझ को पूरी तरह से अनावश्यक सुविधा के लिए जो उपयोगकर्ता को छह कीस्ट्रोक्स बचाता है , और (2) C # 3.0 ने संग्रह संग्रहकर्ताओं को भी जोड़ा:
new List<int>() { 10, 20, 30 }
{10, 20, 30}स्वचालित रूप से एक सरणी क्यों होनी चाहिए ? ऐसा क्यों नहीं होना चाहिए List<int>? या कई अन्य प्रकारों में से कोई एक? सरणियों के प्रति पूर्वाग्रह क्यों? याद रखें, एक बार जब हम सरणियों के लिए वाक्यविन्यास को सुनिश्चित करना चुनते हैं, तो हम हमेशा के लिए इसके साथ फंस जाते हैं । यह कभी भी कुछ और नहीं हो सकता है, इसलिए प्रस्तावित सुविधा न केवल अनावश्यक है, यह भविष्य की संभावित सुविधाओं को भी रोकता है जो प्रशंसनीय लगती हैं।
सारांश: प्रस्तावित सुविधा ने C # 1.0 के कुछ डिज़ाइन सिद्धांतों का सीधे उल्लंघन किया। यह C # 3.0 में अनावश्यक बोझ के अलावा और कुछ नहीं जोड़ता है। C # 3.0 के बाद से भाषा के सभी संस्करणों में, प्रस्तावित सुविधा में कई अन्य योग्य सुविधाओं पर समय, प्रयास और धन खर्च करने की सिफारिश करने के लिए कोई अच्छा तर्क नहीं है।
इसलिए, ऐसी कोई सुविधा नहीं है।