foreach迭代变量错误给出

时间:2014-01-17 04:14:30

标签: c#

foreach(string file in strAllFiles)
{
    foreach(char c in file)
    {
        if (c > 127)
        {
            using (SqlConnection con = new SqlConnection(CS))
            {
                con.Open();
                SqlCommand sqlcom = new SqlCommand("sp_ReplaceNonAsciiCharset", con);
                sqlcom.CommandType = CommandType.StoredProcedure;
                SqlParameter sqlparam = new SqlParameter();
                sqlparam.ParameterName = "@non_ascii_char";
                sqlparam.Direction = ParameterDirection.Input;
                sqlparam.SqlDbType = SqlDbType.NChar;
                sqlparam.Size = 2;
                sqlparam.Value = c;
                sqlcom.Parameters.Add(sqlparam);
                object o = sqlcom.ExecuteScalar();
                int i = file.IndexOf(c);
                file1 = file.Remove(i, 1);
                file2 = file1.Insert(i, o.ToString());
                file = file2;
            }
        }
    }
}

在最后一行file=file2,我收到错误:

  

无法分配给文件,因为它是foreach迭代变量

3 个答案:

答案 0 :(得分:3)

因为你正在改变不允许的循环变量。一种选择是将file1添加到单独的列表中,或者如果使用“for”循环而不是foreach,则可以将其修改。

答案 1 :(得分:2)

  1. 如果您尝试修改strAllFiles集合,则可能应该使用 而不是foreach:
  2. 不要尝试修改文件 foreach(文件中的字符)
  3. 这样的东西
    for(int i=0; i < strAllFiles.Count; i++) 
    {     
        var file = strAllFiles[i];    
        var newFileValue = file;    
        foreach(char c in file) 
        {
          if (c > 127)
          {
             using (SqlConnection con = new SqlConnection(CS))
             {
    
               ...
               // modify newFileValue
               newFileValue = file2;
    
             } 
          }
        }
        // Modify collection
        strAllFiles[i] = newFileValue; 
    }
    

答案 2 :(得分:1)

本声明

file = file2;

需要改变。因为您无法为在foreach中循环的变量赋值。也许,将它分配给一些新的变量。迭代变量是只读的,不能更改。来自c#语言规范的Section 8.4.4

  

迭代变量对应于只读局部变量,其范围扩展到嵌入语句。在执行foreach语句期间,迭代变量表示当前正在执行迭代的集合元素。如果嵌入语句尝试修改迭代变量(通过赋值或++和 - 运算符)或将迭代变量作为ref或out参数传递,则会发生编译时错误。

相关问题