2016-10-07 3 views
0

2つの異なる開発ボックスでコンパイルしたときにコードが異なる動作をする状況があります。なぜ私は理解できません。この問題を最もよく表しているキーワードがわかりません。ウサギは、1つのボックスのソースは、別のボックスソースで値クラスインスタンスを参照する必要がある場合のクロージャのキャプチャ

{() => Program.Names} 

を持っているに呼び出さ

は値

{() => value(NPC.Program+<>c__DisplayClass1_0).Names} 

は穴が常に関係なく、それが上のコンパイル何コンピュータ値を持っていません。

{() => value(NPC.Program+<>c__DisplayClass1_0).closure} 

私はウサギを呼び出すときに1台のマシンが、クラスの表現と他のマシンが閉鎖のための価値を持っていた理由を把握しようとしています。また、それを制御する方法があるかどうかを知りたいと思います。ありがとう!

class Program 
{ 
    public static ObservableCollection<string> Names = new ObservableCollection<string>(); 

    static void Main(string[] args) 
    { 
     string closure = "closure"; 

     if(closure.Length > 0) 
     { 
      GoingDown(p => { 
       closure.ToString(); 
       Names = new ObservableCollection<string>(); 

       Rabbit(() => Names); 
       Hole(() => closure); 
      }, closure); 
     } 
    } 

    public static void Rabbit<SourceType>(Expression<Func<ObservableCollection<SourceType>>> source) 
    { 
     "Testing".ToString(); 
    } 

    public static void Hole(Expression<Func<object>> source) 
    { 
     "Testing".ToString(); 
    } 

    public static void GoingDown(Action<object> a, object target) 
    { 
     Action b =() => 
     { 
      a(target); 
     }; 

     b(); 
    } 
} 
+2

両方のシステムで、どのバージョンのC#とどの.netフレームワークが使用されていますか? – RBarryYoung

答えて

4

最初にコメントが示すように、どのバージョンの.NET/C#/などがどのような動作を生成するかを知ることは役に立ちます。

第2:どちらの場合でも、どちらの場合でも、動作はとなります。?仕様では言いません。ラムダをデリゲートとエクスプレッションツリーとして実装するためにコンパイラに幅広い緯度を与えます。

第3位:これは優れていますか?静的フィールド名をクロージャクラスにコピーする必要はありません。私は非クロージャーバージョンが生成されることを期待します。私はクロージャを生成しているバージョンがバグを持っていると思われます。バグは、クロージャのセマンティクスを表示しないバージョンで修正されている可能性があります。

第4回:この動作を制御できますか?明らかにはい。あなたは行動を持っているマシンとしていないマシンを1台持っているので、悪い行動をしているマシンを海底に沈めることを選んで、目的の動作をしているマシンを使います。

または、コンパイラのラムダセマンティクスの実装を使用する必要はありません。ラムダは統語的な砂糖です。コンパイラがあなたに与える式ツリーが気に入らなければ、 "手作業で"あなたの式ツリーを生成してください。

+0

ラムダにあなたが好きなバージョンを生成させようとするのではなく、自分自身を動かすのではなく、式アナライザを変更して、意味的に有効な式で正しく機能するようにするのが良いでしょう。固定実装。あなたは、あなたが望む特定の私的実装の詳細を調整しようとするのではなく、どのような私的実装の詳細であるかを気にするべきではありません。 – Servy

関連する問題