4

在 C# 4.0 演示中,我看到很多使用动态类型的代码。例如,以下代码设置 Excel 单元格的值:

excel.Cells[1, 1].Value = ...

但是,您也可以使用强制转换以早期绑定方式访问单元:

((范围)excel.Cells[1, 1]).Value = ...;

为什么 Excel COM 库不首先将 Cell 类型描述为 Range 类型?同样,以下方法的所有参数都是动态的:

excel.ActiveWorkbook.Charts.Add(...)

为什么论点不能是静态的?查看 Excel 对象模型,到处都有动态类型。这是由于 COM 表达能力的限制吗?在 COM 库中使用动态类型而不是静态类型时是否存在模式?

4

3 回答 3

2

COM 库将其公开为一个变体,这可能意味着任何数量的事情。使用变体做这么多事情确实是 Office 库的“错误”。

dynamic类型是最接近变体的 .NET 等价物(现在它存在),但出于向后兼容性的原因,团队不想更改tlbimp以在 PIA 中生成动态类型。在链接PIA(将您使用的位构建到自己的程序集中)而不是引用它时,您只会在 C# 4 中获得“变体到动态”的转换。

于 2009-07-27T09:03:13.663 回答
2

在 C# 4.0 演示中,我看到很多使用动态类型的代码。

由于dynamic这是 C# 4.0 中最大的变化之一,如果不是这样,我会感到非常惊讶。这并不意味着您应该立即开始编写所有代码dynamic- 只是您应该认识到它何时可能有用。

当然,方差和可选/命名参数的更改也值得赞赏 - 但做一个更短的演示。

从历史上看,Office(特别是)一直是一个编程的猪,这对于自动化 Office 的人来说是一件“大事*”。

  • 使用 COM(尤其是 Office)的人
  • 使用 DLR 类型的人(IronPython 等)
  • 与动态系统(如 javascript(Silverlight 等))交谈的人

就个人而言,我不希望dynamic彻底改变我用 C# 编程的方式,但这对某些人来说意义重大:

于 2009-07-27T09:07:37.537 回答
1

实际上这是因为 Office com 库是在考虑 Visual Basic 的情况下创建的。

您甚至可以认为整个对象层次结构都是为 VB 创建的(没有 .net 的普通 VB)。并且 VB 在历史上创建了这样一种方式,即可以很容易地从中使用 IDispatch'able com 接口(使用后期绑定)。

而我们现在拥有的是向后兼容的负担。

于 2009-07-27T13:18:28.377 回答