■29811 / ) |
Re[2]: new修飾子による隠蔽とジェネリクス |
□投稿者/ KAZUu (5回)-(2008/12/15(Mon) 13:02:59)
|
>> Console.WriteLine(typeof(T).Name); > > このTはILコードにコンパイルされた段階では、SuperまたはSuperの派生クラスの > 何かということしか明示されていません。型Tが決定されるまで結果は不明です。 > >> t.Write(); > > こちらのtはSuperまたはSuperの派生クラスのインスタンスであることがコンパイル時に > わかっているので、SuperのWrite仮想メソッドを呼び出すようにコンパイルされます。 > (Sub.WriteはSuper.Writeとたまたま同じ名前というだけで、Super.Writeとは無関係なメソッド > であると理解するとわかりやすいかと思います。)
なるほど、ILコードを生成する時点では総称型TをSuper型として扱い、 tの静的な型はSuper型であるとしてコンパイルされるという考えた方でよろしいのでしょうか?
C++のtemplateのように、コンパイル時に総称型TはSub型であると分かるはずなのに、 なぜ、tの静的な型をSub型として扱ってくれないのかと納得できず質問しました。 ジェネリクスはただの置換ではないのですね。
Hongliangさん、囚人さん、よねKENさん、どうもありがとうございました。
|
解決済み
|