我记得曾经听说过抛出某种类型的对象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?