动态对象智能感知

时间:2012-07-02 08:18:17

标签: c# visual-studio object dynamic intellisense

如果动态在编译时解析为对象,并且所有.NET类型都扩展了对象,为什么动态不像IntelliSense的对象那样?每当我使用动态时,我都会收到一条消息“动态表达式。这将在运行时解决”。当然它也应该显示对象成员?

3 个答案:

答案 0 :(得分:4)

智能感知在动态类型中不起作用。它在运行时解决。动态类型适用于静态类型以及匿名类型。

如果intellisense有效,它就会违背动态的目的。

我认为您应该阅读Jon Skeet关于object vs dynamic here

的回答

答案 1 :(得分:1)

我怀疑它没有提供这些成员,因为object上的任何方法都可能存在任意数量的重载 - 它在智能时间显然无法知道。因此它可能会显示特定方法调用的错误的智能感知信息。

答案 2 :(得分:0)

最终因为所有动态操作都使用动态调度,即不是编译时链接,因此实际上无法保证任何成员实际存在 - 甚至ToString - 因为动态一个对象的层可以自由地拦截/替换/删除object的基本操作。因此,智能感知窗口试图显示任何都是不诚实的。

是的,它被编译为object,但更多的是因为(几乎)所有对象都是 object(或者可以被装箱)因此运行时知道,无论动态对象是什么,它都可以作为对象引用。

但是如果你想使用object成员,或者想要智能感知来展示它们,你必须首先强制转换为object - 这本身也是一个动态操作

这并不是说不可能为动态语言显示intellisense成员,当然它是(我相信Iron Python可以),只是在C#中它不是 - 而且是合理的。