using System;
using System.Collections;struct User     //这里改为class则可以编译
{
public User(string name)
{
this.name = name;
} private string name;
public string Name 

get { return name; } 
set { name = value; }
}
};class Test
{
static void Main()
{
ArrayList list = new ArrayList();
list.Add(new User("1"));
((User)list[0]).Name = "2";     //此句无法编译
}
};上面的代码 ((User)list[0]).Name = "2";     无法编译,
提示编译错误:赋值号左边必须是变量、属性或索引器。
如果将User定义为class,则可以正常编译。请问,这个问题该如何解决,怎样修改ArrayList里值类型的对象?

解决方案 »

  1.   

    vs2005, .net 2.0的话干脆用范型。
    正好适用于这类问题。
      

  2.   

    User u=new User("1");
    u.Name="2";
    list[0]=u;struct就是这种操作法,原因一句两句说不清.
      

  3.   

    User user = (User)list[0];
    user.Name = "2";
      

  4.   

    结构是一种值类型。ArrayList.Add()时会把结构转成对象,然后把该对象的引用填加到自身中。也就是发生所谓装箱操作。((User)list[0]).Name这样写就有点意思了。list[0]是一个对象引用,而把对象引用强制转换成一个值类型???你想,list[0]指向的对象其实是在堆空间分配的,那里可能包含一个原始的new User("1")是在栈空间分配的User的一个副本。
    那么
    具体没搞清楚,反正不符合逻辑。
      

  5.   

    User user = (User)list[0]; //必须经过这样的unboxing,把堆里分配的内容再复制到栈区,然后访问结构的属性。
    user.Name = "2";
      

  6.   

    以上都不行,因为值类型赋值是值拷贝,不是引用,所以
    struct ms 
    {
      public int a;
    }
    ms m1 ;
    m1.a = 100;
    ArrayList al = new ArrayList();
    al.Add( m1 ); //注意 al[0] 已经不是 m1这个对象 因为值拷贝 ,只是al[0]的值与m1相等
    ms mtemp = (ms)al[0] //同理这里只是 mtemp 的值与al[0]相等
    mtemp.a = 50 ; //al[0] 并没有被改变我比较菜,只想到用反射来解决这个问题ArrayList al = new ArrayList();
    ms m1;
    m1.a = 100;
    al.Add(m1);
    ms temp = (ms)al[0];
    Type t = typeof(ms);
    System.Reflection.FieldInfo fi = t.GetField("a");
    fi.SetValue( al[0] , 10 );
      

  7.   

    sorry 还有一个办法用指针
      

  8.   

    方法一:
    取出来修改,然后删除原来的,再添加新的,例如:
    ArrayList list = new ArrayList();
    list.Add(new User("1"));
    User itm = (User)list[0];
    itm.Name = "2";
    list.RemoveAt( 0 );
    list.Insert( 0, itm );方法二:
    修改struct地实现,通过继承接口来实现,例如:
    interface IUser
    {
          string Name
          {
              get;set;
           }
    }
    struct User:IUser
    {
    public User(string name)
    {
    this.name = name;
    }private string name;
    public string Name
    {
    get { return name; }
    set { name = value; }
    }
    }//修改的时候可以如下:
    ArrayList list = new ArrayList();
    list.Add(new User("1"));
    ((IUser)list[0]).Name = "2";
      

  9.   

    ((User)list[0]).Name 这句代码发生了什么?为什么 System.Console.Write(((User)list[0]).Name); 正常,而 ((User)list[0]).Name = "2"; 不被允许?我还是不明白,请各位指点
      

  10.   

    http://www.qqgb.com/NetProgramme/ASPNet/AspNetSkill/NetProgramme_137373.html
    看看这个有帮助没有
      

  11.   

    ((User)list[0]).Name 返回一个临时匿名结构,因为struct是值类型,
      

  12.   

    愚翁的的方法是对的,不过也没那么麻烦,直接:User user = ((User)list[0]);
    user.Name = "2";
    list[0] = user;
    即可
    C#编译器这里也太聪明了点儿。原因就是((User)list[0])是一个值而不是变量。什么是值什么又是变量呢?如1 + 2,这就是一个值,所以你不能(1 + 2) = 5;但是a = 1 + 2;a是一个变量,你可以a = 5;
    事实上,我们都很清楚,不能这样写:
    ((User)list[0]) = new User("");
    不论是struct还是class
    而为什么如果User是引用类型并且引用它内部的属性又可以了呢?
    这就是C#编译器聪明的地方了。
    C#编译器知道,对于一个“值”的修改是没有任何意义的。但对于一个“引用值”的修改是有意义的。
    这点就要靠你自己去体会了。