まず第一に、私はこの回答を読みましたが、いいえ、それは現在どのように実装されているかだけを述べていますが、理由は説明していません。
class Program
{
static void Main()
{
try {
implMain();
} catch (Exception e) {
Console.WriteLine(e.ToString());
}
}
static void implMain()
{
for (int i = 0; i < 10; i++) {
invoke(() => {
Console.WriteLine(i);
throw new InvalidOperationException();
});
}
}
static void invoke(Action what)
{
what();
}
}
次のコール スタックを出力します。
System.InvalidOperationException
at ConsoleApplication1.Program.<>c__DisplayClass2.<implMain>b__0()
at ConsoleApplication1.Program.invoke(Action what)
at ConsoleApplication1.Program.implMain()
at ConsoleApplication1.Program.Main()
次の 2 行に注意してください。
at ConsoleApplication1.Program.<>c__DisplayClass2.<implMain>b__0()
at ConsoleApplication1.Program.invoke(Action what)
下のもの ( with ) は、 member を持つ classを持つinvoke()名前空間があることを示しています。ここで、左から右は外側から内側に対応します。ConsoleApplication1Programinvoke()
上のもの ( with c__DisplayClass2) は、名前空間とクラスがあることを再度示しています...
次に、c__DisplayClass2「キャプチャされた変数を格納するためにコンパイラが選択した魔法の名前」を意味する「」があり、<implMain>それが へのパラメータであるかのように表示されますc__DisplayClass2。したがって、c__DisplayClass2何らかの形で の一部でProgramあり、のimplMain一部であるかのように読み取りますc__DisplayClass2。
私が見ているように、論理的には逆です。メソッドがあり、ローカル変数用に特別に作成されたimplMain()「マジック クラス」があります。だから私には、上の行は次のように見えるはずです:c__DisplayClass2implMain()
at ConsoleApplication1.Program.implMain.c__DisplayClass2.b__0()
(おそらく、衝突の可能性を防ぐためにいくつかの追加のシンボルがあります)しかし、私の考えが明確であることを願っています-このように見えるのc__DisplayClass2は、機能を容易にするために特別に作成されたものimplMain()です.
implMain現在の実装では、ローカル変数がクラス名 ( ) をキャプチャした後にメソッド名 ( ) を表示し、c__DisplayClass2その逆ではない理由はありますか?