定义个结构
struct MyStruct
{
public string name;
}然后用它
System.Collections.ArrayList myStructs = new ArrayList();
MyStruct myStruct = new MyStruct();
myStruct.name = "11111";
myStructs.Add(myStruct);foreach(MyStruct my in myStructs)
{
my.name = "222";
}
注意了,上面
my.name = "222";
这行编译时会说“赋值号左边必须是变量、属性或索引器”——读可以,写不允许。写了这么久,居然今天才知道,不过想不通为什么C#要这么限制。另,如果写成
for(int i=0; i<myStructs.Count; i++)
{
MyStruct my = (MyStruct)myStructs[i];
my.name = "333";
}
就没有问题如果定义成
MyStruct[] myStructs = new MyStruct[1];
用foreach的话,也是同样的编译错误!但是的但是:如果定义成class,就没上面的问题~~~~!总结的说:struct搭配foreach,只读。哪位能从机制上给解释一下.net为什么要这样做咛?

解决方案 »

  1.   

    这个限制和Struct的按值传递有关,个人认为可能是.NET认为这样会导致用户的误解才限制的。
      

  2.   

    恩,这样写
    foreach(object obj in myStructs)
    {
    MyStruct my=(MyStruct)obj;
    my.name = "222";
    }
      

  3.   

    你放到myStructs这个里面的myStruct 原来在栈里经过了myStructs.Add(myStruct); 现在堆里多了一个副本(这个是装箱)foreach(MyStruct my in myStructs)这个里面的my在栈里,这里的修改怎么可能影响你在堆里的myStruct?把内存分配看懂了就不会问这样的问题了
      

  4.   

    刚才在for循环里写
    ((MyStruct)myStructs[i]).name="4444";
    也不行,于是想到是struct是值类型上面的my.name="222"里的my已非myStructs[i]了,amandag(高歌) 一开导,立刻茅塞顿开。赞