RefList`1 その2
昨日の続きです。
マネージドポインタ型のメンバフィールドを作成することは出来ないようなので仕様を変更し、設定は値のコピーを実行するが、保持している内部データへの参照を取得できるということにしてみましょう。
ちなみに、ilasm はこういう 文法通りに記載したら、書いた通りのモジュールを生成する というツールですので、メンバフィールドに与えられた型が正しいかどうかのチェックなんて、なーんもしてくれません。そういうのは IL を作る側の仕事だと割り切ったツールですので、各言語のコンパイラとは違うと思ってください。
まず、アクセッサの調整です。get_Item メソッドを、
ldelem !T& ↓ ldelema !T
と変更してみます。コンストラクタやフィールドの宣言、Dump() の実装などもあわせて修正して試してみると、RefList<int> 型の生成と値のセット、Dump() の実行には成功したようです。しかし、問題の値の取得はできません。Reflector.NET でみると、
public ref T this[int index] { get { return ref this.store[index]; } }
という表記になりました。ldelema はメソッド呼び出し時に ref を前置して呼び出すのに使われるので、そのあたりの処理が偶然働いているのでしょうけど、昨日の内容にしても今日の内容にしても、よくできてるかんじの印象をもちますね。
コンパイルエラーが「CS1501: 引数を n 個指定できるメソッド xxx のオーバーロードはありません。」なので、アクセッサメソッドを直接呼出しして引数の個数を確認してみると、引数0個にて「CS0570: xxx はこの言語によってサポートされていません。」が出ることがわかりました。
このあたりで遊びは終わりでしょうか...
もう1回書いてって言われても困るけど
1回、IL の解説をダラダラと入れてみたんですが、あまりにも長くなるので消しました。