"动态"关键字和DLR是否将C#作为动态类型语言提升为一等公民?

Jac*_*sch 0 dynamic-language-runtime c#-4.0

我知道C#4.0中新的"动态"关键字有助于与动态.NET语言的交互,并且可以通过使用它而不是反射来帮助削减代码.因此,用途适用于非常具体的情况.

但是,我想知道的是,它是否会给C#带来其他动态语言(例如IronXXX语言)所带来的所有动态好处?换句话说,是否可以用动态语言风格在C#中编写整个应用程序?

如果有可能,是否会被推荐.为什么,或为什么不分别?

如果不换用另一种语言,我能获得动态语言的所有好处吗?

Jon*_*eet 5

我不会说C#是一流的动态语言,没有.

首先,一些静态类型功能在动态类型方面确实不能很好地运行.例如:

public void ShowListCount(IList foo)
{
    dynamic d = foo;
    Console.WriteLine(d.Count);
}
Run Code Online (Sandbox Code Playgroud)

看起来应该总是有效,因为IList暴露Count,对吧?试试吧:

ShowListCount(new int[10]);
Run Code Online (Sandbox Code Playgroud)

砰.数组IList.Count使用显式接口实现实现,因此当动态类型将对象"看到"为数组时,它看起来不会看到该Count属性.有各种各样的陷阱.

此外,如果要在C#中实现动态行为(即动态调用),则没有明确的语言支持.您可以从自己派生DynamicObject或实施IDynamicMetaObjectProvider自己,但语言中的任何内容都无法帮助您.

我认为C#中的动态类型主要用于与现有动态平台(如IronPython或弱类型COM API)进行互操作时.在某些地方它可以在纯C#中使用,但它们相对较少.

基本上C#仍然是一种非常明显的静态类型设计语言.能够在你想要的地方仔细使用动态类型是很好的,但如果你想在代码库的一个区域广泛使用动态类型,我建议在IronPython中编写那个位,然后从C#调用它.