2

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

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

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

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

4

1 回答 1

2

您在命名空间中遇到异常的CSharp原因是 DLR 已确定有dynamic问题的对象是 C# 对象,并将其传递给 C# 运行时绑定程序进行处理。

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

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

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

于 2013-02-04T01:50:32.380 回答