8

IL を使用して Int32 をスローし、キャッチしています。これはただの好奇心からです。私は何も達成しようとはしていません。そのため、int の代わりに例外をスローするように言わないでください。

.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  // Code size       40 (0x28)
  .maxstack  2
  .locals init (object V_0,
       int32 V_1)
  IL_0000:  nop
  .try
  {
    IL_0001:  nop
    IL_0002:  ldsfld     int32 ConsoleApplication3.Program::i
    IL_0007:  throw
  }  // end .try
  catch [mscorlib]System.Object 
  {
    IL_0008:  stloc.0
    IL_0009:  nop
    IL_000a:  ldstr      "In Object catch"
    IL_000f:  call       void [mscorlib]System.Console::WriteLine(string)
    IL_0014:  nop
    IL_0015:  ldloc.0
    IL_0016:  unbox.any  [mscorlib]System.Int32
    IL_001b:  stloc.1
    IL_001c:  ldloc.1
    IL_001d:  call       void [mscorlib]System.Console::WriteLine(int32)
    IL_0022:  nop
    IL_0023:  nop
    IL_0024:  leave.s    IL_0026
  }  // end handler
  IL_0026:  nop
  IL_0027:  ret
} // end of method Program::Main

これは機能しません。「In Object catch」という文字列が表示されますが、箱から出そうとすると System.InvalidCastException: Specified cast is not valid が発生します。スローされたものの値を取得するにはどうすればよいですか?

4

1 に答える 1

6

CLR のバージョン 2.0 では、CLS に準拠していない例外がスローされると、CLR は自動的に RuntimeWrappedException クラスのインスタンスを構築し、そのプライベート フィールドを初期化して、実際にスローされたオブジェクトを参照します。実際には、CLR はすべての非 CLS 準拠の例外を CLS 準拠の例外に変換します。

try
{
    // ...
}
catch (RuntimeWrappedException e)
{
    int a = (int)e.WrappedException;
}
于 2011-04-28T06:48:53.663 に答える