質問

私は、以下のコード:

string prefix = "OLD:";
Func<string, string> prependAction = (x => prefix + x);
prefix = "NEW:";
Console.WriteLine(prependAction("brownie"));

でコンパイラに置き換えプレフィック変数との閉鎖"新規ブラウニ"を印刷します。

や予防法のコンパイラから引っ掛けて吊り上げるのは、接頭辞を変なものを用いたラムダ。思うという私のFunc作業は全く同じように:

Func<string, string> prependAction = (x => "OLD:" + x);

こういうの必要はありがたいと思いserializeのに限ります。場合には接頭辞の変数は非直列化可能クラスの機能は使用できませんserialize.

の周辺のこの見た瞬間には直列化可能クラスを格納する文字列の一員として変数の文字列誤動作防止)方法:

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;
    }
}

このような多くの業務のコンパイラは"ダム".

役に立ちましたか?

解決

見に裏付け問題になっています。ありが深いですね。基本的には、ソリューションが変更式のツリーの前に直列化さで交換してすべてのツに依存しないパラメータに一定のノード。このあと"funcletization".がついて説明で こちらの.

他のヒント

く別の閉鎖...

と言うようなもの:

var prepend = "OLD:";

Func<string, Func<string, string>> makePrepender = x => y => (x + y);
Func<string, string> oldPrepend = makePrepender(prepend);

prepend = "NEW:";

Console.WriteLine(oldPrepend("Brownie"));

Havnな試験を実施していないアクセスVSの瞬間が、通常、このようにのんびりと、このような問題です。

Lambdas自動的に吸引"のローカル変数、私たことになるだけでどのように作業による定義で設定します。

ここでは、問題が発生する共通の問題につ変数の修飾による閉鎖意図せず-か簡単に解決であった:

string prefix = "OLD:";
var actionPrefix = prefix;
Func<string, string> prependAction = (x => actionPrefix + x);
prefix = "NEW:";
Console.WriteLine(prependAction("brownie"));

使用している場合は、簡単に、ios、androidとmac用にc#で実際に特定のコードでがんリスクが予期せぬ副作用などこう場合はファイルが"すべてのグリーン"コードはOKです。

てきた部分があると思いましてもらったのもよかった場合また統語砂糖を扱うこの状況はいっそのことを書いていいとして、ライナーである

Func<string, string> prependAction = (x => ~prefix + x);

あprefixオペレーターの変数の値に対する評価の前の構築に匿名の委譲します。

取得し現在の問題:のラムダへの参照を含むクラスが直列化可能です。そのようなこと:

public void static Func<string, string> MakePrependAction(String prefix){
    return (x => prefix + x);
}

(注の静的なキーワードとなります。) その後、ラムダなく、参照のを含むクラスです。

既にいくつかの答えがここに説明する方法を避けることができますラムダ"吊り"おに変更します。残念ながらない解決を裏付けの問題です。できないserializeのラムダになり、ラムダを"解除"をご可変となります。場合、ラムダ式のニーズのインスタンスの非serializeクラスに計算させるのでは意味がなされます。

によってどうしようとしていったんでなかなか決めから)ソリューションに移動し、直列化可能でない部分のラムダ仕様です。

例えば、代わりに:

NonSerializable nonSerializable = new NonSerializable();
Func<string, string> prependAction = (x => nonSerializable.ToString() + x);

用途:

NonSerializable nonSerializable = new NonSerializable();
string prefix = nonSerializable.ToString();
Func<string, string> prependAction = (x => prefix + x);

うこ

string prefix = "OLD:";
string _prefix=prefix;
Func<string, string> prependAction = (x => _prefix + x);
prefix = "NEW:";
Console.WriteLine(prependAction("brownie"));

ど:

string prefix = "OLD:";
string prefixCopy = prefix;
Func<string, string> prependAction = (x => prefixCopy + x);
prefix = "NEW:";
Console.WriteLine(prependAction("brownie"));

?

ない場合は、あの話での"問題"は、lambdasからのプログラミングの世界には、純粋なプログラミング言語, ありませんの課題 などの問題をいじめの接頭辞の値がはずっと変わらないと思います。私C#と思ってくれるかどうかっていうのは涼しい輸入アイデアからの機能性プログラム(FP cool!) のものを表現することが困難ですが、きれいで、C#では、常に必要とされるプログラミング言語.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top