我认为如果您放宽要求,有一种方法可以解决它 - 拥有实体数组,允许int
通过对数组的操作来修改局部变量集。
为此,可以在每个委托的委托数组中捕获对变量的引用ref int val
。
void Increase(ref int x)
{
x++;
}
void Set(ref int x, int amount)
{
x = amount;
}
void Sample()
{
int a = 10;
int b = 20;
// Array of "increase variable" delegates
var increaseElements = new Action[] {
() => Increase(ref a),
() => Increase(ref b)
};
increaseElements[0](); // call delegate, unfortunately () instead of ++
Console.WriteLine(a); // writes 11
// And now with array of "set the variable" delegates:
var setElements = new Action<int>[] {
v => Set(ref a,v),
v => Set(ref b,v)
};
setElements[0](3);
Console.WriteLine(a); // writes 3
}
笔记
- 直接使用委托,您必须使用 () 调用它们。
- 可以通过将委托包装到将调用增加作为其实现的对象中来修复
()
而不是问题。++
++
Set
需要调用(3)
而不是= 3
需要更多技巧的版本的问题- 使用索引实现自定义类以重定向set [index]
到调用保存的 setter 函数。
警告:这确实是出于娱乐目的 - 请不要在实际代码中尝试。