动态对象智能感知

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

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

如果intellisense会起作用,它就会违背动态性的目的。

我想你应该在这里阅读关于object vs dynamic Jon Skeet答案

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

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

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

但是如果你想使用object成员,或者你想要intellisense来显示它们,你必须首先转换为object – 这本身也是一个动态操作。

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