如果dynamic在编译时解析为object,并且所有的.NET类型都扩展object,那么对于IntelliSense来说,dynamic为什么不像object那样工作呢?每当我使用dynamic时,我都会收到一条消息,上面写着“动态表达式。这将在运行时解决”。当然,它也应该显示对象成员?
发布于 2012-07-02 16:19:44
智能感知在动态类型中不起作用。它在运行时被解析。动态类型适用于静态类型和匿名类型。
如果intellisense能够工作,那它就违背了动态性的目的。
我认为你应该读一下乔恩·斯基特关于object vs dynamic here的回答
发布于 2012-07-02 16:21:29
我怀疑它没有提供这些成员,因为object上的任何方法都可能有任意数量的重载-这显然是它在智能感知时不知道的。因此,它可能会为特定的方法调用显示错误的智能感知信息。
发布于 2012-07-02 16:22:20
最终,因为所有动态操作都使用动态分派,即不是编译时链接,因此不能保证任何成员确实存在-甚至ToString -因为对象的动态层可以自由地拦截/替换/移除甚至是object的基本操作。因此,对于intellisense窗口来说,试图显示任何内容都是不真诚的。
是的,它被编译为object,但这更多是因为(几乎)所有对象都是object (或者可以这样装箱),因此运行时知道,无论动态对象是什么,它都可以作为对象引用保存。
但是如果你想使用object成员,或者你想让智能感知显示它们,你必须首先转换成object --这本身也是一个动态操作。
这并不是说不能为动态语言显示intellisense成员,当然可以(我相信Iron Python可以),只是在C#中是不可能的--这是合理的。
https://stackoverflow.com/questions/11289995
复制相似问题