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