2013-07-02 12 views
9

मैं अशक्त की एक प्रारंभिक मूल्य के लिए एक चर प्रदान करना चाहते हैं, और अगले if में अपने मूल्य निर्दिष्ट करें - else ब्लॉक, लेकिन संकलक एक त्रुटि दे रहा है,प्रारंभ मूल्य शून्य पर

लागू रूप से टाइप किए गए स्थानीय चर प्रारंभ किए जाने चाहिए।

मैं इसे कैसे प्राप्त कर सकता हूं?

+6

http://stackoverflow.com/questions/2904689/how-to-initialize-var – Longball27

उत्तर

26

var चर के पास अभी भी एक प्रकार है - और संकलक त्रुटि संदेश कहता है कि घोषणा घोषणा के दौरान स्थापित की जानी चाहिए।

विशिष्ट अनुरोध (प्रारंभिक शून्य मान असाइन करना) किया जा सकता है, लेकिन मैं इसकी अनुशंसा नहीं करता हूं। यह यहाँ एक फायदा प्रदान नहीं करता है (के रूप में प्रकार अभी भी निर्दिष्ट किया जाना चाहिए) है और यह कोड कम पठनीय बनाने के रूप में देखा जा सकता है:

var x = (String)null; 

कौन सा अभी भी "प्रकार निष्कर्ष निकाला" है और बराबर करने के लिए:

String x = null; 

कंपाइलर var x = null स्वीकार नहीं करेगा क्योंकि यह किसी भी प्रकार के साथ शून्य को संबद्ध नहीं करता है - ऑब्जेक्ट भी नहीं। उपरोक्त दृष्टिकोण का उपयोग करके, var x = (Object)null "काम" करेगा हालांकि यह संदिग्ध उपयोगिता है।

आम तौर पर, जब मैं var के प्रकार निष्कर्ष सही ढंग से तो उपयोग नहीं कर सकते

  1. मैं एक जगह है जहाँ यह स्पष्ट रूप से चर घोषित करने के लिए सबसे अच्छा है पर हूँ; या
  2. मुझे कोड को फिर से लिखना चाहिए जैसे वैध मान (स्थापित प्रकार के साथ) घोषणा के दौरान असाइन किया गया है।

दूसरा दृष्टिकोण विधियों या कार्यों में कोड को स्थानांतरित करके किया जा सकता है।

+0

साझा करने के लिए धन्यवाद, यह है उपयोगी जानकारी। –

+0

यह लैम्ब्डा तीरों और विधि समूहों के साथ समान है, जिनके पास स्वयं भी एक प्रकार नहीं है। उदाहरण के लिए 'var isEven = i => i% 2 == 0;' संकलित नहीं होगा। हमें 'var' 'Func ', '',' MyDelegate', 'अभिव्यक्ति >', आदि के साथ 'var' का आदान-प्रदान करना होगा। या, यदि हम 'var' का उपयोग करने पर जोर देते हैं, तो हम उपरोक्त की तरह कर सकते हैं, 'var isEven = (Func ) (i => i% 2 == 0;)'। –

+0

@JeppeStigNielsen यह आंशिक रूप से इस बिंदु पर विनिर्देश का "सीमा" है (कम से कम सी # 4 तक): -/पहले में होने पर भी उदाहरण है कि बाहरी संदर्भ के बिना प्रकार तुरंत हल नहीं किए जा सकते हैं (क्योंकि मैं अनबाउंड है), मैं वास्तव में चाहते हैं कि 'var x = (int y) => y * 2;' की अनुमति थी। ध्यान दें कि इस काउंटर-उदाहरण मामले में एक कंपाइलर (और स्कैला करता है) अनुमान लगाता है कि 'Func x = (int y) => y * 2; '' int y' दिया गया है और 'int * int -> int' । – user2246674

1

var सी # के मुख्य लाभ में कीवर्ड पठनीयता को बढ़ाने के लिए है, कार्यक्षमता नहीं। तकनीकी रूप से, var कीवर्ड कुछ अन्य अनलॉक (उदा। अज्ञात वस्तुओं का उपयोग) के लिए अनुमति देता है, लेकिन ऐसा लगता है कि यह इस प्रश्न के दायरे से बाहर है। प्रत्येक चर को var कीवर्ड के साथ घोषित किया गया है। उदाहरण के लिए, आप पाएंगे कि निम्न कोड "स्ट्रिंग" आउटपुट करता है।

String myString = ""; 
Console.Write(myString.GetType().Name); 

var कीवर्ड बस सी # की और कहा, "मैं संदर्भ से myString के लिए प्रकार पता लगा सकते हैं, तो चिंता मत करो का तरीका है:

var myString = ""; 
Console.Write(myString.GetType().Name); 

इसके अलावा, ऊपर कोड के बराबर है प्रकार निर्दिष्ट करने के बारे में। "

var myVariable = (MyType)null या MyType myVariable = null काम करना चाहिए क्योंकि आप सी # कंपाइलर संदर्भ दे रहे हैं कि myVariable किस प्रकार का होना चाहिए।

अधिक जानकारी के लिए:

+0

अगर मुझे इस वर्ग को एकाधिक वर्ग वस्तुओं में असाइन करना है, तो अन्य स्थितियों के आधार पर यदि अन्य ब्लॉक , यह काम करेगा, क्योंकि हम इसे 'माईटाइप' प्रकार में निर्दिष्ट कर रहे हैं, क्या बाद में कोड में अपना प्रकार बदलना संभव है। –

+1

इसे केवल प्रकारों के बीच डालना संभव है। तो आप निम्न की तरह कुछ कर सकते हैं: 'MyType myVariable' और' (MyOtherType) myVariable'। हालांकि, अगर आप पाते हैं कि आप बहुत अधिक कास्टिंग कर रहे हैं तो आप अपने पैटर्न पर पुनर्विचार करना चाहेंगे। विरासत या जेनेरिक के साथ विकल्पों पर विचार करें। –

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