C# 使用+;更新操作在存储在集合或变量中后不链接操作

C# 使用+;更新操作在存储在集合或变量中后不链接操作,c#,collections,delegates,action,C#,Collections,Delegates,Action,我正在尝试在集合中存储操作,如下所示: List<Action> localActionList = new List<Action>(); localActionList.Add(anotherObject.action1); localActionList.Add(anotherObject.action2); 调用另一个Object.action1时,LocalListenerMethod不会激发。我已经到了怀疑这与委托不变性有关的地步,但我不知道如何做我需要做的

我正在尝试在集合中存储操作,如下所示:

List<Action> localActionList = new List<Action>();
localActionList.Add(anotherObject.action1);
localActionList.Add(anotherObject.action2);
调用另一个Object.action1时,
LocalListenerMethod
不会激发。我已经到了怀疑这与委托不变性有关的地步,但我不知道如何做我需要做的事情(迭代操作列表,将它们分配给本地侦听器,在原始类中调用原始操作时调用它们)。请注意,在简单地分配给原始操作时,我可以让侦听器启动

更简单的示例(无阵列):

调用另一个Object.action1时,
LocalListenerMethod
不会激发

这是因为
另一个object.action1
的值从未更改

要详细说明Eric的评论,请考虑:

string a = "A", b = "B";
List<string> list = new List<string>();

list.Add(a);
list.Add(b);
list[0] += "C";
是否更改
actionList
的索引
0
处元素的值。但这对原始变量另一个对象的值没有任何影响。操作1。该变量的值与以前完全相同。将该变量的值传递给列表的
Add()
方法只需将该值(对委托类型实例的引用)从该变量复制到该方法的参数列表,即可传递该值。但是变量本身并没有提供给列表,列表对象也没有任何方法来修改变量

为了回应你的评论:

我更倾向于
var x=new MyType(){prop1=5};变量y=x;x、 prop1+=1

这是一个非常不同的场景。这更像是这样:

actionList[0] += LocalListenerMethod;
MyType x = new MyType { prop1 = 5 };
List<MyType> list = new List<MyType>();

list.Add(x);
list[0].prop1 += 1;

// Here, x.prop1 will be equal to 6, as would list[0].prop1
MyType x=newmytype{prop1=5};
列表=新列表();
增加(x);
列表[0]。prop1+=1;
//这里,x.prop1将等于6,列表[0]也是如此
请注意,在该示例中,代码不是修改列表元素本身,而是修改列表元素引用的对象的类成员。也就是说,表达式
list[0]中的“变量”(即“变化的事物”)。prop1+=1
prop1
属性,而不是
list[0]
元素,如上面的前两个示例所示。在第三个示例中,
list[0]
仅用于获取属性
prop1
的对象,而不涉及
+=
赋值


顺便说一下,埃里克的评论一点也不尖刻。他在问你一些问题,旨在精确地缩小让你对这个场景感到困惑的是什么。他试图了解你对C#中其他场景的理解程度,以及他是否以及如何使用这些其他场景来帮助解释这一场景。在提问过程中,你可能自己发现了自己的误解,但如果没有,这些问题的答案将为Eric提供一种方法,让他专注于他需要关注的事情,以便尽可能高效地对你做出有益的回应


提问是一项需要学习的技能。在回答自己的问题的过程中,你可以通过减少对被问问题的防御性,特别是通过认可经典的教育技巧,来提高自己的提问技能,经过时间测试,旨在使问题和答案最有效。

看起来您想要的是
event
s。让我们编写另一个程序:
string x=“a”;字符串y=x;x+=“b”;控制台写入线(x);控制台写入线(y)你期望什么?您是否希望在使用委托的程序版本中产生不同的结果?@EricLippert我感觉自己掉进了陷阱,但我会,因为委托是引用类型,int是值类型。我更倾向于
var x=new MyType(){prop1=5};变量y=x;x、 prop1+=1
(MyType是一个类),在这种情况下,
x.prop1
y.prop1
都是6。显然我错了引用类型与值类型有什么关系?您希望字符串具有不同的行为吗?我已将注释改为使用字符串而不是int。你认为事情会发生变化吗?斯内克科技奖颁给了埃里克。然后,如何在集合中保留对原始操作的引用,以便在调用原始操作时调用它?不能在声明事件的类之外引用事件。我想将属于一个对象的委托集合存储在另一个对象中,然后对这些委托进行迭代,并根据需要分配方法。我感谢您的全面响应,您所说的很有意义。我剩下的问题是,如何创建一个委托引用集合,当调用原始引用时,这些引用实际上会被激发。Re:snark。我们都知道问题在教育学中的价值。正如这是一项习得的技能,书面交流也是如此。仅仅因为我们谈论的是技术并不能证明在交流中缺乏基本的惯例是合理的——也就是说,tact@Orbis:“我剩下的问题是,如何创建一个委托引用集合,当调用原始委托引用时,这些委托引用实际上会被激发”——您可以选择任何方式。在你的问题中没有足够的上下文来知道什么方法最适合你。一个显而易见的解决方案是修改原始的:
anotherObject.action1+=()=>localActionList[0]()。另一个显而易见的解决方案是更改调用另一个对象的代码。action1
,以便它也调用
localActionList[0]
@Orbis:。。。另一种解决方案是使用容器类型来保存
action1
,并将该容器放在
localActionList
实例中,而不是
Action
实例中,然后当您想要修改它时,您修改容器中的值(这将在两个位置更新它,一个
actionList[0] += LocalListenerMethod;
MyType x = new MyType { prop1 = 5 };
List<MyType> list = new List<MyType>();

list.Add(x);
list[0].prop1 += 1;

// Here, x.prop1 will be equal to 6, as would list[0].prop1