CSharp命名空间中的RuntimeBinderException是否表示DLR语言依赖?

时间:2013-02-04 01:21:48

标签: c# .net dynamic

考虑到与语言无关的.NET Framework,包括类库和运行时,以及DLR受多种语言支持的事实,我发现奇怪的是,C#应用程序中的子类System.Dynamic.DynamicObject实际上抛出了异常在CSharp命名空间中。尝试访问运行时不存在的dynamic上的成员时,我捕获到以下异常:

{Name = "RuntimeBinderException" FullName = "Microsoft.CSharp.RuntimeBinder.RuntimeBinderException"}

RuntimeBinderException异常是否特定于C#,如果是,每种语言是否必须实现自己的绑定异常?令我感到奇怪的是,为什么异常不是在更通用的命名空间中,这让我想知道“什么事情发生了”?

我在.NET 4.5上的VS 2012 Express中以调试模式运行。该应用程序是用C#构建的。

1 个答案:

答案 0 :(得分:2)

您在CSharp命名空间中获得异常的原因是因为DLR已确定所讨论的dynamic对象是C#对象,并已将其传递给C#运行时绑定程序处理。

支持DLR的每种语言都需要自己的运行时绑定系统的实现,每种语言都取决于语言的语义。例如,支持动态属性和方法创建的JScript等语言可能不会在每次绑定失败时抛出异常,而是设置或返回一个新属性。

所以答案是,是的,每个想要在DLR绑定失败时抛出异常的语言都必​​须单独实现它。

(另一个例子:VB.NET对动态对象的支持与它现有的后期绑定支持完全相同;您将从DLR绑定失败中获得与后期绑定IDispatch失败相同的错误例如,所以它不需要单独的例外。)