11

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

4

1 回答 1

3

.NET-2.0 之前的版本有所不同。我在 .NET 1.1 天读到了它。

这里有解释(我不会复制它)。请注意,第一个答案是错误的,第二个是正确的。

至于它是否实用:不。我想这对于晦涩的互操作场景很重要。

于 2012-12-31T15:51:11.580 回答