2

MonoTouch 辞書の制限について非常に混乱しています: http://docs.xamarin.com/ios/about/limitations#Value_types_as_Dictionary_Keys

このようなコードは許可されていないという私の理解:

var foo = new Dictionary<int, int>();

しかし、私は本に次のようなコードを目にしますが、これは意味がありません。

protected Dictionary<int, CustomCellController> _cellControllers = new Dictionary<int, CustomCellController>();

また、null 許容型を使用すると、値が参照に変換されるため、次のように機能することが投稿されました (キーが null でない限り)。

var foo = new Dictionary<int?, int?>();

null許容型は値型である構造体であるため、これも意味がありません。

では、デバイスで辞書を使用する場合の実際のルールは何ですか?

4

1 に答える 1

2

デバイスでは JITin が許可されていないため、すべてのコードを AOT (事前) コンパイラでコンパイルする必要があります。

このようなコードは許可されていないという私の理解:

この制限は、AOT コンパイラにとって、実行時に何が使用されるかを決定することの難しさに関するものです。このようなコードは機能する可能性があり、サンプルにそのようなコードが表示されますが、コードの操作によっては失敗する可能性もあります ( を作成することDictionaryは問題ではありません)。

では、デバイスで辞書を使用する場合の実際のルールは何ですか?

値型を使用すると、生成されたコードを共有できなくなります (参照型の場合と同様)。たとえば、と でジェネリックDictionaryを使用するには別のコードが必要ですが、とで同じコードを共有できます。intlongstringCustomCellController

必要なものを見つけることDictionary<int,int>は問題ではありません (かなり明確です)。しかし、物事が複雑になるのはしばしば内部です。たとえば、権利が確実にKeyValuePair生成されるようにします。入れ子になったジェネリックも正しく取得するのが困難です。

これが、最初の一般的な回避策が、AOT コンパイラーに何が必要かについてヒントを与えることである理由です。AOT コンパイラーが、必要なものを生成するために必要なコードを見つけることができれば、それは実行時に利用可能になります。

次の回避策は、値型の代わりに参照型 (astringなど) を使用することです (AOT コンパイラにとっては、その方が処理が簡単なため)。

最後に、AOT コンパイラは (リリースごとに) 改善されており、この (およびその他の) 制限を軽減し続けています。したがって、ここで読んだことは、3、6、12 か月後には当てはまらない可能性があります...

于 2012-10-29T12:23:45.150 に答える