2013-03-26 3 views
0

Так что я получаю эту ошибку при назначении текстового поля, но я не понимаю, почему, может ли кто-нибудь дать мне совет о том, что делать?Использование непринятой ошибки локальной переменной (строки)

private void button2_Click(object sender, EventArgs e) 
    { 
     int n = Convert.ToInt32(textBox16.Text); 
     int t = Convert.ToInt32(textBox17.Text); 
     matrix.CalculeazaQR(n, t); 

     string temp; 

     for (int i = 0; i < n; i++) 
     { 
      for (int j = 0; j < n; j++) 
      { 
       temp = matrix.q[i, j].ToString("0.00"); 

       if (j % (n - 1) == 0) 
        temp += "\n"; 

       temp += ","; 

      } 

     } 
     textBox3.Text = temp; 

    } 

ответ

5

Вы назначаете temp внутри для цикла и компилятор не может определить, будет ли получить внутри цикла или нет. Вы можете инициализировать temp сверху, как:

string temp = string.Empty; 

отчетности внутри цикла будет выполняться только если условие истинно, и компилятор во время компиляции не может определить, будет ли условие истинным или нет, он будет рассматривать темп остается неназначенным, следовательно, ошибка.

+0

спасибо он работал. –

+0

@ guNNer2bad, добро пожаловать http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work – Habib

1

«Может ли кто-нибудь дать мне совет о том, что делать?»
Ну, Инициализировать текст:

string temp = string.Empty; 

компилятор не имеет возможности узнать, если темп (который используется на textBox3.Text = temp;) имеет значение после петель (например, при п < 1).

2

положить так:

string temp=""; 

вы должны назначить строку (или любой другой переменной) опорожнить или что-то прежде, чем вы на самом деле использовать его.

+0

* «вам нужно назначить строку пустым **, когда вы ее объявите ** «* Собственно, вы этого не делаете. Только при использовании переменной позже вам нужно будет присвоить ей значение * до *, используя переменную. 'string temp; temp = "foo"; ЕЫпе (температура); '. Никакое присвоение при объявлении не работает. Это связано с тем, что компилятор может определить со 100% уверенностью, что до использования * temp * ему будет присвоено значение. Также работает: 'string temp; if (a == b) temp = "foo" else temp = "bar"; Console.WriteLine (foo); 'потому что в любом случае' if'-statement foo будет присвоено значение. – RobIII

+0

@RobIII Я согласен, я отредактировал свой ответ соответственно. – Freelancer

1

С одной стороны, ваш цикл нарушается, чтобы начать с - только самой последней итерации будет иметь значение (то есть, когда оба i и j являются n - 1), как вы полностью заменить значение temp.

Но компилятор не знает, что n положительный - он не знает, что вы будете войти в цикл. В общем случае компилятор никогда не предполагает, что вы вводите тело оператора if, заявление for, оператор while или цикл foreach - поэтому любые присвоения, сделанные в этих телах, не влияют на то, что локальная переменная определенно назначена или нет в конце инструкции ... и локальная переменная должна быть определенно назначена, прежде чем вы сможете ее прочитать (как вы делаете в конце метода).

Я подозреваю, что вы на самом деле хотите StringBuilder, который вы добавляете в пределах цикла:

StringBuilder builder = new StringBuilder(); 
for (...) 
{ 
    for (...) 
    { 
     builder.AppendFormat("{0:0.00},", matrix.q[i, j]);    
    } 
    builder.Append("\n"); 
} 
textBox3.Test = builder.ToString(); 
Смежные вопросы