3

次のコードは、この行を実行するときに例外をスローします(つまり、something.Add(name))。

これを実行するときに実際の例外をキャッチしたいと思います。つまり、ここでスローされる正しい例外が何であるかを知りたいのではなく、catch(Exception ex)を使用したくないということです。

try
{
  dynamic name= "test";
  var something = new List<decimal>();
  something.Add(name);
}
catch(Exception ex)
{
  throw ex;
}

前もって感謝します。

4

2 に答える 2

21

文字列を小数にキャストしようとしている理由はわかりませんが、わかりました...答えはMicrosoft.System.CSharp.RuntimeBinder.RuntimeBinderExceptionです。

ソース:実際にコードを実行しています。:)

于 2012-09-15T03:36:50.940 に答える
1

動的型はほとんどの状況でオブジェクト型のように動作し、静的型チェックをバイパスします。コンパイル時に、動的タイプの要素がすべての操作をサポートすると想定されます。
[ソース:MSDN-1MSDN-2 ]

あなたの場合:

  • つまり、動的型の変数を定義すると、それはオブジェクト型のように扱われるため、任意の値を格納し、それを10進数のリストに追加しても、コンパイラはエラーをスローしません。
  • ただし、実行時に動的変数の型は「文字列」として解決され、文字列値を10進数のリストに追加しようとしているため、実行時に例外がスローされます。

次のコードを試してみてください。

try
{
  dynamic name= "test";
  var something = new List<decimal>();
  something.Add(name);
}
catch (Microsoft.CSharp.RuntimeBinder.RuntimeBinderException ex)
{
  Console.WriteLine(ex.Message);
}

動的タイプの例:

using System;
class Program
{
    static void Main(string[] args)
    {
        dynamic dynVar = 2;
        Console.WriteLine(dynVar.GetType());
    }
}

次のように出力されます:

System.Int32


実行しようとしていること:
IDEに次の行を追加するだけで、コンパイル時エラーが表示されます。

List<decimal> dl = new List<decimal>();
dl.Add("Hello");
于 2012-09-15T05:49:24.347 に答える