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 ]

在你的情况下:

  • 这意味着,当您定义一个动态类型的变量时,它将被视为对象类型,因此您可以在其中存储任何值,并且可以将其添加到十进制列表中,编译器不会抛出任何错误。
  • 但是在运行时动态变量类型将被解析为“字符串”,并且您正在尝试将字符串值添加到十进制列表中,这就是运行时会抛出异常的原因。

您可以尝试以下代码:

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 回答