2009-10-28 12 views
7

この質問への回答を見ている間に: "Why is an out parameter not allowed within an anonymous method?"ラムダ式と匿名メソッドが実際にどのように機能するかについて、少し迷っています。ラムダ式は内部でどのように動作しますか?

JaredParは、「outパラメータがスタック上のローカル変数を参照したとしたら、ラムダは将来の任意の時点で実行でき、そのスタックフレームがもはや有効でなくなったときに実行できることを想像してください"

私はそれが他の変数の場合ではないと指摘しました。基本的に私はラムダ式について実際に何を知っているのだろうかと思います。

私が考えている事は、このようなものである。そのような状況で

public void Foo(ComplexObject val, out SomeDelegate outDelegate) 
{ 
    ComplexObject obj = new ComplexObject(val) 
    SomeDelegate = delegate(int other) { return (obj.value * other); } 
} 

public void Bar() 
{ 
    SomeDelegate MyDel = null; 
    Foo(5, out MyDel); 
    int finalRes = MyDel(100); 
    // Whatever 
} 

私は本当に何が起こっているのか分かりません。 objは、メソッドの戻り時にもはや有効ではないスタック上の参照です。そうすれば、匿名メソッドは参照型を実際に知り、参照の代わりに値をコピーすることができます。なぜ、 "ユースケース"が多かれ少なかれ同じであれば、paramsは動作しませんでしたか?

答えて

6

のすべてにリンク部6へのリンクがあるあなたが

探している答えを提供する必要があります。

基本的に、コンパイラは外部メソッドをクラスに変換し、匿名メソッドによってアクセスされるすべての変数をクラスのフィールドに変換します。匿名メソッドは、クラスの通常のインスタンスメソッドになります。

関連する問題