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