2008-11-01 15 views
28

मुझे यकीन नहीं है कि मुझे यह त्रुटि क्यों मिल रही है, लेकिन यह कोड संकलित नहीं होना चाहिए, क्योंकि मैं पहले से ही यह देखने के लिए जांच कर रहा हूं कि कतार प्रारंभ हो रही है या नहीं?सी # त्रुटि: असाइन किए गए स्थानीय चर का उपयोग

public static void Main(String[] args) 
{ 
    Byte maxSize; 
    Queue queue; 

    if(args.Length != 0) 
    { 
     if(Byte.TryParse(args[0], out maxSize)) 
      queue = new Queue(){MaxSize = maxSize}; 
     else 
      Environment.Exit(0); 
    } 
    else 
    { 
     Environment.Exit(0); 
    } 

    for(Byte j = 0; j < queue.MaxSize; j++) 
     queue.Insert(j); 
    for(Byte j = 0; j < queue.MaxSize; j++) 
     Console.WriteLine(queue.Remove()); 
} 

तो अगर कतार आरंभ नहीं किया है, तो के लिए छोरों से पहुंचा जा सकता सही नहीं हैं? चूंकि प्रोग्राम पहले ही पर्यावरण के साथ समाप्त हो गया है। एक्सिट (0)?

आशा है कि ya'll मुझे कुछ संकेत दिए गए :)

धन्यवाद दे सकते हैं।

+6

मैं आपको कोई संकेत नहीं दे सकता, लेकिन मुझे उम्मीद है कि आप इस पर एक संभाल पा सकते हैं। – wprl

उत्तर

73

कंपाइलर यह नहीं जानता कि पर्यावरण.एक्सिट() प्रोग्राम को समाप्त करने जा रहा है; यह सिर्फ आपको कक्षा पर एक स्थिर विधि निष्पादित करता है। जब आप इसे घोषित करते हैं तो बस queue को शून्य पर प्रारंभ करें।

Queue queue = null; 
9

कंपाइलर यह नहीं जानता कि पर्यावरण। एक्सिट() वापस नहीं आता है। क्यों मुख्य() से "वापसी" नहीं?

+0

मैं पर्यावरण का उपयोग करना पसंद करता हूं। यदि किसी स्क्रिप्ट से प्रोग्राम कहा जाता है तो गैर-शून्य त्रुटि स्थिति के साथ निष्पादित करें।इस तरह लिपि जान सकती है कि प्रोग्राम सफल था या नहीं, बाहर निकलने की स्थिति की जांच करके। – tvanfosson

+4

मुख्य प्रकार के int में वापसी प्रकार बदलें और स्थिति वापस करें। –

0

कंपाइलर केवल जानता है कि यदि आप "वापसी" का उपयोग करते हैं तो कोड केवल पहुंच योग्य नहीं है या पहुंच योग्य नहीं है। पर्यावरण के बारे में सोचें। एक्सिट() एक फ़ंक्शन के रूप में जिसे आप कॉल करते हैं, और संकलक को यह नहीं पता कि यह एप्लिकेशन बंद कर देगा।

+0

मैं पहुंचने योग्य कोड के दो अन्य स्रोतों के बारे में सोच सकता हूं: लूप में तोड़ें या जारी रखें, और फेंक दें :) –

+0

यह सच है। मैं इस विशिष्ट प्रश्न का जिक्र कर रहा था, लेकिन स्पष्टीकरण के लिए धन्यवाद, इससे कुछ गलत व्याख्या हो सकती है। –

8

समस्या को हल करने के लिए विभिन्न तरीकों में से एक जोड़े:

बस वापसी के साथ Environment.Exit बदलें। संकलक जानता है कि वापसी विधि को समाप्त करती है, लेकिन पर्यावरण को नहीं जानता है। एक्सिट करता है।

static void Main(string[] args) { 
    if(args.Length != 0) { 
     if(Byte.TryParse(args[0], out maxSize)) 
     queue = new Queue(){MaxSize = maxSize}; 
     else 
     return; 
    } else { 
     return; 
} 

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

static int Main(string[] args) { 
    if(args.Length != 0) { 
     if(Byte.TryParse(args[0], out maxSize)) 
     queue = new Queue(){MaxSize = maxSize}; 
     else 
     return 1; 
    } else { 
     return 2; 
    } 
} 

प्रारंभ अशक्त करने के लिए कतार है, जो वास्तव में सिर्फ एक संकलक चाल है कि कहते हैं, "मैं अपने खुद के अप्रारंभीकृत चर पता लगा लेंगे, आपको बहुत बहुत धन्यवाद" है किया जाएगा। यह एक उपयोगी चाल है, लेकिन मुझे इस मामले में यह पसंद नहीं है - यदि शाखाएं आसानी से जांच कर रही हैं कि आप इसे ठीक से कर रहे हैं तो आपके पास बहुत अधिक हैं। क्या तुम सच में यह इस तरह से करना चाहता था हैं, तो कुछ इस तरह साफ होगा:

static void Main(string[] args) { 
    Byte maxSize; 
    Queue queue = null; 

    if(args.Length == 0 || !Byte.TryParse(args[0], out maxSize)) { 
    Environment.Exit(0); 
    } 
    queue = new Queue(){MaxSize = maxSize}; 

    for(Byte j = 0; j < queue.MaxSize; j++) 
    queue.Insert(j); 
    for(Byte j = 0; j < queue.MaxSize; j++) 
    Console.WriteLine(queue.Remove()); 
} 

Environment.Exit के बाद एक वापसी कथन जोड़ें। फिर, यह एक संकलक चाल के और अधिक है - लेकिन थोड़ा और अधिक कानूनी IMO क्योंकि यह मनुष्य के लिए अर्थ विज्ञान कहते हैं और साथ ही है (हालांकि यह है कि vaunted 100% कोड कवरेज से आप रखेंगे)

static void Main(String[] args) { 
    if(args.Length != 0) { 
    if(Byte.TryParse(args[0], out maxSize)) { 
     queue = new Queue(){MaxSize = maxSize}; 
    } else { 
     Environment.Exit(0); 
     return; 
    } 
    } else { 
    Environment.Exit(0); 
    return; 
    } 

    for(Byte j = 0; j < queue.MaxSize; j++) 
    queue.Insert(j); 
    for(Byte j = 0; j < queue.MaxSize; j++) 
    Console.WriteLine(queue.Remove()); 
} 
+0

बहुत ही जानकारीपूर्ण पोस्ट के लिए धन्यवाद। – jkidv

-4

SqlConnection चोर; एसक्यूएल कॉमांड कॉम; con = new SqlConnection ("डेटा स्रोत =। \ SQLEXPRESS; AttachDbFilename =" + Server.MapPath ("~ \ App_Data \ Database.mdf") + "; एकीकृत सुरक्षा = सही; उपयोगकर्ता इंस्टेंस = सही"); con.Open();

com = new SqlCommand("insert into blog values(@b)", con); 
    //com.Parameters.AddWithValue("@a", TextBox1.Text); 
    com.Parameters.AddWithValue("@b",TextBox2.Text); 
    com.ExecuteNonQuery(); 
    con.Close(); 
    TextBox1.Visible = true; 
    SqlDataReader DR1; 

    while (DR1.Read()) 
    { 
     TextBox1.Text = DR1[1].ToString(); 
    } 

त्रुटि आ रही है जो असाइन किए गए स्थानीय चर का उपयोग करती है।

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

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