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迭代变量
答案 0 :(得分:3)
因为你正在改变不允许的循环变量。一种选择是将file1添加到单独的列表中,或者如果使用“for”循环而不是foreach,则可以将其修改。
答案 1 :(得分:2)
像
这样的东西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参数传递,则会发生编译时错误。