我记得曾经听说过抛出某种类型的对象System.Exception
(或扩展它的对象)在技术上是合法的 CIL,尽管 C# 没有支持它的功能。所以我有兴趣看到以下 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
System.Object
在 C# 中,一般 catch 子句作为类型过滤器而不是发射是否有任何实际影响System.Exception
?