ビルド時に指定された複数行のラムダを式ツリーに書き換えることでCS0834を根絶しようとする Roslyn ベースのカスタム ツールを作成しています。
編集:現時点では、匿名の複数行ラムダのみを対象としています。
例えば:
// Will produce CS0834 if Bar takes Expression<Action<...>>
Foo.Bar((int x) => { ... });
に
Foo.Bar(Expression.Lambda<Action<int>>(
Expression.Block(
...
),
Expression.Parameter(typeof(int))));
したがって、正しくコンパイルされます。与えられたコードを変換するために必要な Expression.(blah) 構文を理解することはできますが、Roslyn を使用してそれを行うことはまったく別の問題です。おそらく、私は Roslyn Syntax.(blah) API をよく知らないだけで、この生のラムダを変換することができません。
(int index, float[] a, float[] b) =>
{
var sum = 0f;
for (int i = 0; i < index; i++)
sum += a[i];
b[index] = sum;
});
以下のような式ツリーを生成する Roslyn Syntax.(blah) 構文を書くのを誰か手伝ってくれませんか?
Expression<Action<int, float[], float[]>> action =
Expression.Lambda(
Expression.Block(
Expression.Assign(sumParameter, Expression.Constant(0)),
Expression.Loop(...) // The for loop here
)
);
出発点ができたら、このプロジェクトで単純なケースを理解するか、少なくとも翻訳を開始できるはずです。
どうもありがとう、あなたの助けは大歓迎です。