两个List<>让一个等于另一个,然后改变其一,另一个也会跟着变,怎么回事?

publicclassa{staticvoidMain(string[]args){List<double>x=newList<double>{};List<double... public class a
{
static void Main(string[] args)
{List<double> x = new List<double> { };List<double> y = new List<double> { };
x.Add(1);
y=x;x[0]=2;
Console.WriteLine(x[0] + " " + y[0]);
Thread.Sleep(999999);
}
}

x[0] 和y[0] 都是2
展开
 我来答
白羊swcyz
推荐于2017-12-15 · 超过26用户采纳过TA的回答
知道答主
回答量:44
采纳率:0%
帮助的人:46万
展开全部
代码中,x,y一开始都是新建了一个对象,所以分配了不同的空间,而当你使用 y=x时,这就让y指向了x的空间,所以当x的值发生改变时,y也发生改变
更多追问追答
追问
如果不是list 就不会出现这个问题

double x,y ;
x = 1;
y = x;
x = 2;
Console.WriteLine(x + " " + y);

结果是 x=2 y=1 所以和命名空间没什么关系 我认为这是bug
追答
你这个不是对象,你说的是基本类型,基本类型之间的 = 号,是指赋值而已。
怪个奇葩
2018-09-25
知道答主
回答量:1
采纳率:0%
帮助的人:825
展开全部
把y=x换成y.Add(x[0]),其他不变,结果就成了x[0]=2,y[0]=1。
这两个的区别:
y=x,把x的引用给了y,那么x变了,y也就变了;

y.Add(x[0]),把x[0]的值的引用给了y当前下标,但是x[0]是double 型的,也就是内存中是在常量池内,即y[0]存的是常量池中1的引用。x[0]=2,这里改变了x[0]的引用,注意,不可能把常量池中的1变为2,所以是在常量池中找到2将其引用给x[0],这里跟y[0]无关,所以其存的依然是1的引用。
如果list中存的是一个对象Cat,
x[0].Add(new Cat("白"));
y=x; //对x改变,y也随着改变;

y.Add(x[0]); //对x改变,y也随着改变。因为这里y[0]和x[0]存的同一个对象的引用。
Cat cat = (Cat) x[0]; //并没有生成新对象,cat和y[0],x[0]一样指向同一对象

cat.setColor("黑"); //仍然指向同一对象,并且这个对象已经被改了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式