はい、これができないのには非常に正当な理由があります。単純な理由はコストです。C#(またはVB)でこの機能を有効にすると、コストが非常に高くなります。
ラムダ関数の編集は、現在のENC(Edit'n'Continue)アーキテクチャでは解決が非常に難しいENC問題のクラスの特定のケースです。つまり、ENCが次のいずれかを実行する方法をENCすることは非常に困難です。
- クラスの形式でメタデータを生成します
- ジェネリックメソッドを編集または生成します
最初の問題は論理的な制約ですが、ENCアーキテクチャのいくつかの制限にもぶつかります。つまり、問題はファーストクラスを生成することはそれほど難しいことではないということです。面倒なのは、2回目の編集後にクラスを生成することです。ENCエンジンは、ライブコードだけでなく、生成されたクラスのシンボルテーブルの追跡を開始する必要があります。通常、これはそれほど悪くはありませんが、生成されたクラスの形状がそれが使用されるコンテキストに基づいている場合(クロージャのためのラムダの場合のように)、これはますます困難になります。さらに重要なことに、プロセスですでに生きているクラスのインスタンスとの違いをどのように解決しますか?
2番目の問題は、CLRENCアーキテクチャの厳密な制限です。これを回避するためにC#(またはVB)でできることは何もありません。
残念ながら、ラムダはこれらの問題の両方に真っ向からぶつかりました。短いバージョンでは、ラムダのENCには、既存のクラス(他のENCから生成された場合とされていない場合があります)に対する多くのミューテーションが含まれます。大きな問題は、現在のプロセススペースで生きている新しいコードと既存のクロージャーインスタンスの違いを解決することです。また、ラムダは他のコードよりもジェネリックを多く使用する傾向があり、問題#2にぶつかります。
詳細はかなり毛深いですし、通常のSOの答えには少し複雑すぎます。私はこのテーマについて長いブログ投稿を書くことを検討しました。私がそれに近づいたら、私はそれをこの特定の答えにリンクし直します。