2012-10-29 42 views
2

使用字典我對MonoTouch的字典限制很困惑:http://docs.xamarin.com/ios/about/limitations#Value_types_as_Dictionary_Keys在MonoTouch的

我的理解是這樣的代碼是不允許

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

但我看到的代碼在書中這樣,這是沒有意義的:

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

此外,有人發佈,如果您使用可空類型,它會轉變S中的值代入參考,因此下面的工作(只要關鍵是NOT NULL):

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

這也沒有什麼意義,因爲可空類型是結構這是值類型。

那麼關於在設備上使用字典的真正規則是什麼?

回答

2

由於設備上不允許JITin,所以必須使用AOT(提前編譯)編譯所有代碼。

我的理解是這樣的代碼是不允許的:

此限制的困難,對於AOT編譯器,確定哪些會在運行時使用的。這樣的代碼可能工作,你會看到樣本代碼 - 但它也可能會失敗,取決於你對代碼做什麼(創建Dictionary不是問題)。

那麼關於在設備上使用字典的真正規則是什麼?

使用值類型意味着生成的代碼不能共享(就像它可以用於引用類型)。例如。使用通用Dictionaryintlong需要單獨的代碼,而相同的代碼可以共享stringCustomCellController

找到Dictionary<int,int>需要什麼不是問題(這很清楚)。然而,內部情況往往是事情變得複雜,例如確保生成正確的KeyValuePair。嵌套泛型也很難找到正確的。

這就是爲什麼第一一般的解決辦法是儘量提示的AOT編譯器有什麼需要。如果AOT編譯器能夠找到需要它來生成所需內容的代碼,那麼它將在運行時可用。

下一個解決方法是嘗試使用引用類型(例如string)而不是值類型(因爲該情況對於AOT編譯器來說更簡單)。

最後,AOT編譯器逐漸變好(每次發佈),並且作品繼續減少這個(和其他)限制。所以你在這裏讀到的內容可能不適用於3,6,12個月......

+0

Thans爲您的迴應。這是缺少一些代碼還是你的意思是不允許上述所有的代碼? 此外,這是否意味着var foo = new Dictionary ();只要它不與泛型一起使用,是否允許使用? –

+0

這不是允許或不允許的問題。這是*所需*代碼的生成與否的問題。基本的使用方法可以很容易地確定使用什麼,但是一些方案(例如LINQ查詢)可能無法在沒有附加解決方法的情況下運行。如果有疑問,請嘗試在iOS設備上執行它。如果它不起作用,請嘗試解決方法(並將其報告爲一個錯誤,以便我們可以查看它)。 – poupou

+0

謝謝,我只是有一個關於你的迴應上面的問題。它說:「我的理解是這樣的代碼是不允許的:」。那是缺少的代碼? –