私は次のコードを持っています:
string prefix = "OLD:";
Func<string, string> prependAction = (x => prefix + x);
prefix = "NEW:";
Console.WriteLine(prependAction("brownie"));
コンパイラがプレフィックス変数をクロージャに置き換えるため、「NEW:brownie」がコンソールに出力されます。
ラムダ式を使用しているときにコンパイラーがプレフィックス変数を持ち上げないようにする簡単な方法はありますか?Funcを次のように機能させる方法が必要です。
Func<string, string> prependAction = (x => "OLD:" + x);
これが必要な理由は、結果のデリゲートをシリアル化したいからです。プレフィックス変数がシリアル化できないクラスにある場合、上記の関数はシリアル化されません。
現時点で私が見ることができるこれを回避する唯一の方法は、文字列をメンバー変数として格納し、文字列の先頭に追加するメソッドを持つ新しいシリアル化可能なクラスを作成することです。
string prefix = "NEW:";
var prepender = new Prepender {Prefix = prefix};
Func<string, string> prependAction = prepender.Prepend;
prefix = "OLD:";
Console.WriteLine(prependAction("brownie"));
ヘルパークラスあり:
[Serializable]
public class Prepender
{
public string Prefix { get; set; }
public string Prepend(string str)
{
return Prefix + str;
}
}
これは、コンパイラを「ダム」にするための多くの余分な作業のようです。