どうやら ICSharpCode Decompiler は、ラムダ式の C# コンパイラによって作成された内部クラスをどうにかして逆コンパイルしません。次の例を検討してください。
場合によっては、C# のラムダ式は、ラムダの本体を含むメソッドを使用して内部クラスにコンパイルされます。たとえば、次のような C# コードです。
class MyClass
{
public void MyMethod()
{
Parallel.For(0, 10, i =>
{
... = 3 * i;
})
}
}
コンパイラは、次のような内部クラスを追加します。
class MyClass
{
public void MyMethod()
...
public class c__DisplayClass2()
{
public int i;
public void b__0()
{
... = 3 * i;
}
}
}
(これとまったく同じではないかもしれませんが、アイデアはわかります。)
問題は、これらの内部クラスMyClass
を使用してアセンブリからプログラムで AST を構築しようとすると、ASTICSharpCode.Decompiler.Ast.AstBuilder
に含まれないことです (他のすべては問題ありません)。MyClass
の注釈の中にこれらの生成されたクラスを見ることさえできますTypeDecleration
:型の注釈は、Mono.Cecil.TypeDefinition
これらの内部クラスをそのNestedTypes
プロパティに正しくリストします(したがって、それらはアセンブリから適切にロードされましたが、構文ツリーには追加されませんでした;他の、手動で作成された内部クラスは適切に逆コンパイルされます)。
私が開いたこの ILSpy の問題も参照してください: https://github.com/icsharpcode/ILSpy/issues/686
ここで明らかな何かが欠けていますか?また、GUI を使用して ILSpy からのアセンブリを調べたところ、問題のコードは適切に逆コンパイルされています (内部クラスではなく、ラムダが再構築されています)。