如果动态在编译时解析为对象,并且所有.NET类型都扩展了对象,为什么动态不像IntelliSense的对象那样?每当我使用动态时,我都会收到一条消息“动态表达式。这将在运行时解决”。当然它也应该显示对象成员?
答案 0 :(得分:4)
智能感知在动态类型中不起作用。它在运行时解决。动态类型适用于静态类型以及匿名类型。
如果intellisense有效,它就会违背动态的目的。
我认为您应该阅读Jon Skeet关于object vs dynamic
here
答案 1 :(得分:1)
我怀疑它没有提供这些成员,因为object
上的任何方法都可能存在任意数量的重载 - 它在智能时间显然无法知道。因此它可能会显示特定方法调用的错误的智能感知信息。
答案 2 :(得分:0)
最终因为所有动态操作都使用动态调度,即不是编译时链接,因此实际上无法保证任何成员实际存在 - 甚至ToString
- 因为动态一个对象的层可以自由地拦截/替换/删除object
的基本操作。因此,智能感知窗口试图显示任何都是不诚实的。
是的,它被编译为object
,但更多的是因为(几乎)所有对象都是 object
(或者可以被装箱)因此运行时知道,无论动态对象是什么,它都可以作为对象引用。
但是如果你想使用object
成员,或者想要智能感知来展示它们,你必须首先强制转换为object
- 这本身也是一个动态操作
这并不是说不可能为动态语言显示intellisense成员,当然它是(我相信Iron Python可以),只是在C#中它不是 - 而且是合理的。