是否有解决方法来更新匿名方法中的ref参数?
我知道匿名方法不允许访问外部作用域的ref参数,但还有另一种方法吗?我正在为MessageStream使用外部库,因此无法更改委托的参数...
void DoWork(ref int count)
{
MessageStream Stream = new MessageStream();
Stream.MessageReceived += (o, args) =>
{
//Error cannot use ref or out parameter inside anonymous method
count++;
};
}
答案 0 :(得分:5)
在您的情况下,此问题没有可行的解决办法:当Stream.MessageReceived
事件触发时,count
可能远远超出您DoWork
的来电者的范围功能。
在这种情况下,您应该将count
封装在一个对象中,并在事件处理程序和调用者中保留对该对象的引用,如下所示:
class Counter {
public int Value {get;private set;}
public void Increment() {Value++;}
}
void DoWork(Counter count) {
MessageStream Stream = new MessageStream();
Stream.MessageReceived += (o, args) => {
count.Increment();
};
}
答案 1 :(得分:1)
如果要让委托从外部作用域更新变量,请传递一个设置值的lambda,而不是将计数传递ref
。
//shared var
private static int _count = 0;
//call your method
DoWork(() => _count++); //instead of DoWork(ref _count);
void DoWork(Action countInc)
{
MessageStream Stream = new MessageStream();
Stream.Activated += (o, args) => countInc();
}