【问题标题】:foreach iteration variable Error is giving [closed]foreach 迭代变量错误给出 [关闭]
【发布时间】:2014-01-17 04:14:29
【问题描述】:
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 迭代变量

【问题讨论】:

  • 请明确说明您打算做什么!如果您不指定您要做什么,我们无法帮助解决它!
  • 这个错误很容易解释..您正在尝试为作为foreach迭代一部分的变量分配一个值..
  • 复制错误信息到谷歌——几乎只给出答案...
  • 你列出了很多事实。你想问一个问题吗?

标签: c#


【解决方案1】:

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

【讨论】:

    【解决方案2】:
    1. 如果您尝试修改 strAllFiles 集合,您可能应该使用 for 而不是 foreach:
    2. 不要尝试修改文件 foreach(文件中的字符 c)

    类似

    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; 
    }
    

    【讨论】:

    • 这里的 strAllfiles 是一个字符串数组,它包含 6 个文件。我如何在这里使用 i
    • 从您放置的代码中看不到 strAllFiles 的类型。只需将 Count 替换为 Length。
    【解决方案3】:

    此声明

    file = file2;
    

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多