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

标签 c# .net dynamic

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

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

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

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

最佳答案

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

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

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

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

关于c# - CSharp 命名空间中的 RuntimeBinderException 是否表示 DLR 语言依赖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14679259/

相关文章:

.net - 一些旧代码的线程问题

c# - 如何在 Angular 10 中使用 DevExpress 报表设计器和报表查看器

.net - 异步Thread.Sleep()

c# - 在 WPF 绑定(bind)中获取 IValueConverter 实现的 ConvertBack() 方法中的 Source 值

c# - MS UpdatePanels 不是真正的 AJAX?

C#.net 如何通过代码将图像动态添加到表格单元格中

sql - 如何触发一个表改变另一个表列的值

html - 根据表上的信息动态增加表的高度

c# - 将一个对象复制到另一个对象

c# - 如何在 ASP.NET MVC 5 中注册自定义主体类型?