11

System.ExceptionC# にはそれをサポートする機能はありませんが、(またはそれを拡張する)以外の型のオブジェクトをスローすることは、技術的に合法な 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ますか?

4

1 に答える 1

3

.NET-2.0 より前では違いあります。.NET 1.1 の時代にそれについて読みました。

こちらで説明されています(コピーはしません)。最初の答えが間違っていて、2 番目の答えが正しいことに注意してください。

それが実用的かどうかについて: いいえ。あいまいな相互運用シナリオでは重要だったと思います。

于 2012-12-31T15:51:11.580 に答える