動的がコンパイル時にオブジェクトに解決され、すべての .NET 型がオブジェクトを拡張する場合、IntelliSense に関して動的がオブジェクトのように動作しないのはなぜですか? 動的を使用するたびに、「動的式。これは実行時に解決されます」というメッセージが表示されます。オブジェクトメンバーも表示する必要がありますか?
3 に答える
インテリセンスは動的型では機能しません。実行時に解決されます。動的型は、静的型だけでなく匿名型にも使用できます。
インテリセンスが機能していたとしたら、動的性の目的そのものに反していたでしょう。
ここでジョンスキートの回答を読むべきだと思いobject vs dynamic
ます
これらのメンバーが提供されていないのではないかと思います。これは、任意の数のオーバーロードが任意のメソッドに存在する可能性があるためですobject
。これは明らかにインテリセンス時に知ることができません。そのため、特定のメソッド呼び出しに対して誤ったIntelliSense 情報が表示される可能性があります。
最終的には、すべての動的操作が動的ディスパッチを使用するため、つまりコンパイル時のリンクではなく、オブジェクトの動的レイヤーが自由にインターセプト/置換/削除できるため、メンバーが実際に存在するという保証はありませToString
ん。の操作object
。その結果、インテリセンス ウィンドウが何かを表示しようとするのは不誠実です。
はい、それは としてコンパイルされobject
ますが、(ほぼ) すべてのオブジェクトが object
そうである(またはそのようにボックス化できる) ため、ランタイムは、動的オブジェクトが何であれ、オブジェクト参照として保持できることを認識しています。
しかし、object
メンバーを使用したい場合、またはそれらを IntelliSense で表示したい場合は、object
最初にキャストする必要があります。これは、それ自体が動的操作でもあります。
もちろん、動的言語のインテリセンス メンバーを表示できないと言っているわけではありません。