2013-03-26 66 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

您在for循环和编译器分配temp内不能确定是否会得到循环与否里面。您可以像上面初始化temp:内环路

string temp = string.Empty; 

语句,如果条件为真,并在编译时,编译器无法判断病情是否会真还是假只会执行,它会考虑临时保留未分配,因此错误。

+0

谢谢你,它的工作。 – 2013-03-26 11:31:49

+0

@ guNNer2bad,欢迎您访问http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work – Habib 2013-03-26 11:34:11

1

“谁能给我一个建议做什么?”
那么,初始化文本:

string temp = string.Empty; 

编译器无法知道是否(N < 1时例如)温度(其上使用textBox3.Text = temp;)具有循环之后的值的方式。

2

放像这样:

string temp=""; 

你必须指定字符串(或变量)为空或东西之前,你使用它。

+0

*“您必须在声明时将字符串赋给空** “* 其实,你没有。只有当稍后使用变量时,您需要在使用变量之前为其赋值*。 '字符串温度; temp =“foo”; Console.WriteLine(温度);'。宣言中没有任何分配,仍然有效。这是因为编译器可以确定100%的确定性,在使用* temp *之前,它将被赋值。也适用:'字符串温度;如果(a == b)temp =“foo”else temp =“bar”; Console.WriteLine(foo);'因为在if语句的任何一种情况下foo都会被分配一个值。 – RobIII 2013-03-26 10:38:07

+0

@RobIII我同意,我相应地编辑了我的答案。 – Freelancer 2013-03-26 10:42:15

1

一件事,你的循环被打破,开始与 - 只有最后一个迭代将物质(即当两个ijn - 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();