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里值类型的对象?
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里值类型的对象?
解决方案 »
- PropertyChangedEventHandler
- 问题请教。。。
- DesignerHosting研究,xml的问题
- 在PictrueBox中绘制Rectangle矩形,并且这个矩形能够用鼠标拖动到PictrueBox上合适的位置,双击鼠标能够将矩形选择的图获取出来。。。。
- 天,以前用DELPHI的时候TEXTBOX控件很简单,怎么C#中这么难,请好心人进来看看
- VS2005发布网站,上传到服务器上出错!!SOS急救
- DataGridView请教
- 最后3000分!webform + web service + winform之间的通讯
- MVVM DelegateCommand<T>的一个不理解的地方
- 请问,在log4net,能否给不同的级别设置不同的样式?
- 关于动态调用DLL的问题~
- 区别:socket与b/s结构的http协议传输
正好适用于这类问题。
u.Name="2";
list[0]=u;struct就是这种操作法,原因一句两句说不清.
user.Name = "2";
那么
具体没搞清楚,反正不符合逻辑。
user.Name = "2";
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 );
取出来修改,然后删除原来的,再添加新的,例如:
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";
看看这个有帮助没有
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#编译器知道,对于一个“值”的修改是没有任何意义的。但对于一个“引用值”的修改是有意义的。
这点就要靠你自己去体会了。