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

本文关键字:指示 DLR 语言 依赖性 是否 RuntimeBinderException 命名空间 CSharp | 更新日期: 2023-09-27 17:57:30

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

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

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

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

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

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

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

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

(另一个例子是:VB.NET对动态对象的支持与现有的后期绑定支持完全相同;例如,DLR绑定失败会导致与后期绑定IDispatch失败相同的错误,因此不需要单独的异常。)