मैं एक पूर्णांक के साथ ऐसा कर सकता हूं:

int a;
a = 5;

लेकिन मैं एक पूर्णांक सरणी के साथ ऐसा नहीं कर सकता:

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

क्यों नहीं?

स्पष्ट करने के लिए, मैं सही वाक्यविन्यास की तलाश नहीं कर रहा हूं। कि मैं ऊपर देख सकता हूं। मुझे पता है कि यह काम करता है:

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

जो के बराबर होगा:

int a = 5;

जो मैं समझने की कोशिश कर रहा हूं, वह कोड सरणियों के लिए विफल क्यों है? कोड को मान्य मानने में विफल होने के पीछे क्या कारण है।

13
wickyd 29 नवम्बर 2015, 17:19

7 जवाब

सबसे बढ़िया उत्तर

अंतर होने का कारण यह है कि Microsoft के लोगों ने एक ही बयान में सरणी को और घोषित करते हुए सिंटैक्स को हल्का करने का फैसला किया, लेकिन आवश्यक सिंटैक्स को इसमें नहीं जोड़ा आपको बाद में इसे एक नई सरणी असाइन करने की अनुमति देता है।

यही कारण है कि यह काम करता है:

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

लेकिन यह नहीं है:

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

क्या वे इसे अनुमति देने के लिए वाक्यविन्यास जोड़ सकते थे? यकीन है, लेकिन वे नहीं किया। सबसे अधिक संभावना है कि उन्होंने महसूस किया कि यह usecase शायद ही कभी इस्तेमाल किया जाता है कि यह अन्य विशेषताओं पर प्राथमिकता नहीं देता है। सभी नई सुविधाएँ माइनस 100 अंकों के साथ शुरू होती हैं और शायद यही किया ' टी वरीयता सूची में पर्याप्त उच्च रैंक।

ध्यान दें कि { 1, 2, 3, 4, 5 } का कोई अर्थ नहीं है, यह केवल दो स्थानों पर दिखाई दे सकता है:

  • एक सरणी चर घोषणा के भाग के रूप में:

    int[] a = { 1, 2, 3, 4, 5 };
    
  • एक सरणी निर्माण अभिव्यक्ति के भाग के रूप में:

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

दूसरी ओर, 5 संख्या का हर जगह अर्थ होता है, यह C # में दिखाई देता है, यही कारण है कि यह काम करता है:

int a;
a = 5;

तो यह सिर्फ विशेष वाक्य रचना है C # के डिजाइनरों ने समर्थन करने का फैसला किया, इससे ज्यादा कुछ नहीं।

इस सिंटैक्स को C # विनिर्देशन, अनुभाग 12.6 एरियर इनिशिएटिव) में प्रलेखित किया गया है। ।

16
Lasse V. Karlsen 29 नवम्बर 2015, 15:16

var a = new int[] { 1, 2, 3, 4, 5 }; - प्रकार के संकेत के साथ सरणी का आरंभीकरण।

var a = new[] { 1, 2, 3, 4, 5 }; या var a = { 1, 2, 3, 4, 5 }; - बिना किसी प्रकार के संकेत के सरणी का आरंभीकरण; प्रकार सरणी के तत्वों के प्रकार से पाया जाता है।

-1
pt12lol 30 नवम्बर 2015, 07:28

पहली बार में सरणियों का प्रकार और लंबाई निर्धारित की जानी चाहिए:

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

यदि आप इसे बाद में जोड़ना चाहते हैं, तो आप सूचियों का उपयोग कर सकते हैं:

var myList = new List<int>();
myList.Add(1);
myList.AddRange(new [] {2 , 3 , 4 , 5})

आप एक सरणी के रूप में अपनी सूचियों का परिणाम प्राप्त कर सकते हैं:

var result = myList.ToArray(); //result is an array of {1,2,3,4,5} values.
-1
Pedram 29 नवम्बर 2015, 15:04

{} सिंटैक्स सरणी आरंभीकरण के लिए उपलब्ध है, घोषणा के बाद उपयोग करने के लिए नहीं।

0
Ramanlfc 29 नवम्बर 2015, 14:23

यह एक इंट सरणी इनिशियलाइज़ करने के लिए सिंटैक्स है:

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

int[] निरर्थक है क्योंकि प्रकार सरणी में दिए गए मानों द्वारा निर्धारित किया जा सकता है। तो आप लिख सकते हैं:

var a = new[] { 1, 2, 3, 4, 5 };
1
Sievajet 29 नवम्बर 2015, 14:21

आपके सरणी उदाहरण के काम न करने का कारण मान और संदर्भ प्रकार। एक int एक मूल्य प्रकार है। यह स्मृति में एकल स्थान है जिसका मूल्य बदला जा सकता है।

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

इस पहली पंक्ति में, आप null से a असाइन कर रहे हैं।

int[] a;

अगली पंक्ति में, यदि आप सरणी का मान बदलना चाहते हैं, तो आपको इसे नए सरणी में असाइन करने की आवश्यकता है।

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

इसीलिए आपको सरणी के भीतर मूल्यों की सूची से पहले new[] की आवश्यकता है यदि आप दृढ़ता से अपनी घोषणा टाइप करते हैं।

int[] a = {1, 2, 3, 4, 5}; // This will work.
var a = {1, 2, 3, 4, 5}; // This will not.

हालाँकि, जैसा कि अन्य जवाबों में कहा गया है, यदि आप इसे एक ही पंक्ति में घोषित करते हैं, तो आपको {{XX}} की आवश्यकता नहीं है। यदि आप घोषणा और आरंभीकरण को अलग करते हैं, तो आपको new[] का उपयोग करना आवश्यक है।

2
krillgar 29 नवम्बर 2015, 14:38