System.Exception
C# にはそれをサポートする機能はありませんが、(またはそれを拡張する)以外の型のオブジェクトをスローすることは、技術的に合法な CIL であると聞いたことがあることを思い出します。そのため、次の C# コードを確認することに興味がありました。
try {
throw new Exception();
} catch(Exception x) {
try {
throw;
} catch {
Console.Write("yes");
}
}
次の CIL にコンパイルされます。
.try
{
IL_0000: newobj instance void [mscorlib]System.Exception::.ctor()
IL_0005: throw
} // end .try
catch [mscorlib]System.Exception
{
IL_0006: pop
.try
{
IL_0007: rethrow
} // end .try
catch [mscorlib]System.Object
{
IL_0009: pop
IL_000a: ldstr "yes"
IL_000f: call void [mscorlib]System.Console::Write(string)
IL_0014: leave.s IL_0016
} // end handler
IL_0016: leave.s IL_0018
} // end handler
ここで、ネストされた一般的な catch 句が次のようにコンパイルされることがわかります。
catch [mscorlib]System.Object
C# では、一般的な catch 句System.Object
が ではなく type filter として発行されることについて、実際に何か意味はありSystem.Exception
ますか?