要件を緩和すれば、それを解決する方法があると思います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
}
ノート
- デリゲートを直接使用するには、()を使用してそれらを呼び出す必要があります。
- 実装としてIncreaseを呼び出すオブジェクトにデリゲートをラップすることで、問題
()
の代わりに修正できる場合があります。++
++
- 代わりに
Set
呼び出す必要があるバージョンの問題は、より巧妙な作業が必要になります-保存されたセッター関数を呼び出すようにリダイレクトするために、インデックス付きのカスタムクラスを実装します。(3)
= 3
set [index]
警告:これは実際には娯楽目的で行われます。実際のコードで試さないでください。