2009-01-05 22 views
6

आप इस तरह एक सरणी को प्रारंभ कर सकते हैं:संग्रह प्रारंभ

int [ ] arr = { 1, 2, 3, 4, 5 }; 

लेकिन List<T> इस अनुमति नहीं देता:

List<int> list = { 1, 2, 3, 4, 5 }; 

इसके पीछे क्या कारण है?

के बाद दोनों सब इस अनुमति देते हैं:

int [ ] arr = new int [ ] { 1, 2, 3, 4, 5 }; 

List<int> list = new List<int> { 1, 2, 3, 4, 5 }; 

भी कारण है कि यह एक LinkedList<T> के साथ ऐसा करना संभव नहीं है:

LinkedList<int> ll = new LinkedList<int>() { 1, 2, 3 }; 

अद्यतन

धन्यवाद दोस्तों। बस जवाब देखा। मैं कई जवाब चुनना चाहता था लेकिन उसने मुझे ऐसा नहीं करने दिया।

लिंक्डलिस्ट के पास स्पष्ट कार्यान्वयन के बावजूद एक ऐड विधि क्यों है? क्या यह संभवतः तय किया जाएगा? क्योंकि इस तरह की समस्याएं अनदेखी होने पर बस बड़े लोगों में बर्फ़ीली होंगी, है ना?

उत्तर

14

आपका पहला नमूना पूर्णांकों की एक सरणी आरंभ करने के लिए मानक भाषा वाक्य रचना है। बाएं हाथ का मूल्य int [] पर मूल्यांकन करता है। दूसरे नमूने में आप एक int [] को एक सूची <int> पर असाइन करने का प्रयास कर रहे हैं। असाइनमेंट ऑपरेटर इसका समर्थन नहीं करता क्योंकि वे अलग-अलग प्रकार हैं। एक सूची < पूर्णांक > प्रकार int की एक सरणी नहीं है। आप कहते हैं के रूप में, हालांकि, वहाँ सूची के लिए एक निर्माता < पूर्णांक > कि एक तर्क और नए वाक्यात्मक चीनी के रूप में एक पूर्णांक [] ले करता है में जोड़ा # 3.0 सी आप उपयोग कर {} संग्रह द्वारा परिभाषित करने के लिए सदस्यों को जोड़ने की सुविधा की अनुमति देता है डिफ़ॉल्ट कन्स्ट्रक्टर।

जैसा कि @ पैट्रिक कहते हैं, यह लिंकडलिस्ट के लिए काम नहीं करेगा क्योंकि यह अपने इंटरफेस के हिस्से के रूप में ऐड() विधि को परिभाषित नहीं करता है (आईसीओलेक्शन का एक स्पष्ट कार्यान्वयन है। जोड़ें) ताकि वाक्य रचनात्मक चीनी नहीं होगी काम।

एक आसान काम के आसपास LinkedList के लिए, फिर भी है।

public class LinkedListWithInit<T> : LinkedList<T> 
{ 
    public void Add(T item) 
    { 
     ((ICollection<T>)this).Add(item); 
    } 
} 

LinkedList<int> list = new LinkedListWithInit<int> { 1, 2, 3, 4, 5 }; 
+0

हेह ने मुझे इसे हराया, लेकिन संक्षेप में रखा। +1 – Kev

+1

मुझे लगता है कि यह थोड़ा अजीब है, क्योंकि लिंक्डलिस्ट (टी) के पास एक ऐड-विधि है, जिसे आईसीओलेक्शन (टी) -इंटरफेस के लिए लागू किया गया है। यह स्पष्ट रूप से लागू किया गया है, इसलिए जब तक आप सूची को आईसीओलेक्शन (टी) में नहीं डालते, तब तक यह सार्वजनिक नहीं है, लेकिन मुझे लगता है कि यह वैध होना चाहिए। –

+0

लेकिन इसे प्रारंभ करने का प्रयास करने के बीच इसे आईसीओलेक्शन में डालने का कोई तरीका नहीं है, इसलिए स्पष्ट रूप से कार्यान्वित इंटरफ़ेस बेकार है। मैंने इसे स्पष्ट करने के लिए अपना उत्तर अपडेट कर दिया है। – tvanfosson

1

मैंने महसूस किया कभी नहीं आप एक LinkedList (टी) के साथ संग्रह आरंभीकरण उपयोग नहीं कर सकते, लेकिन यह तार्किक लगता है, क्योंकि इसमें कोई "जोड़ें" विधि है, यह बजाय "AddFirst" और "AddLast" है। संग्रह प्रारंभिकरण "जोड़ें" -method का उपयोग करता है।

1

क्योंकि सरणी बनाने के लिए भाषा में बनाया गया है, उदाहरण के लिए int [], float [], WhateverClassHere []। यह वाक्यविन्यास सरणी शुरू करने के लिए, सरणी बनाने के लिए है।

आपके उदाहरण में, आप इनट्स की एक सरणी बना रहे हैं। किसी सूची में मान जोड़ने के लिए उस वाक्यविन्यास का उपयोग करना काम नहीं करना चाहिए क्योंकि सूची एक सरणी नहीं है।

+0

आप इस तरह के जटिल प्रकारों के सरणी को तुरंत चालू कर सकते हैं, इसका इसके साथ कुछ लेना देना नहीं है। प्रश्न यह है कि सरणी बनाने के लिए सिंटैक्स अलग-अलग संग्रह प्रारंभ करने से अलग होता है। –

+0

ओह, मुझे यह एहसास नहीं हुआ। –

6

सी # 3 क्या है।

निम्नलिखित कि एक संग्रह प्रारंभकर्ता शामिल एक ऑब्जेक्ट निर्माण अभिव्यक्ति का एक उदाहरण है:: 0 भाषा युक्ति विषय पर कहना चाहता है

List<int> digits = new List<int> { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; 

संग्रह वस्तु जो एक संग्रह करने के लिए प्रारंभकर्ता को लागू किया जाना चाहिए एक प्रकार का होना जो सिस्टम लागू करता है। चयन। INumerable या संकलन-समय त्रुटि होती है। क्रम में प्रत्येक निर्दिष्ट तत्व के लिए, संग्रह प्रारंभकर्ता तर्क सूची के रूप में तत्व प्रारंभकर्ता की अभिव्यक्ति की सूची के साथ लक्ष्य वस्तु पर एक जोड़ें विधि invokes, प्रत्येक मंगलाचरण के लिए सामान्य अधिभार संकल्प को लागू करने। इस प्रकार, संग्रह ऑब्जेक्ट में प्रत्येक तत्व प्रारंभकर्ता के लिए लागू विधि लागू होना चाहिए।

जब आप इसके बारे में सोचते हैं तो यह समझ में आता है। कंपाइलर यह सुनिश्चित करता है कि आप एक संख्यात्मक प्रकार पर काम कर रहे हैं जो एक ऐड फ़ंक्शन लागू करता है (जिसके माध्यम से यह प्रारंभ होता है)।

संबंधित मुद्दे