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>();

此外,有人发布说,如果您使用可为空的类型,它会将值转换为引用,因此以下工作(只要键不为空):

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

这也没有意义,因为可空类型是值类型的结构。

那么在设备上使用字典的真正规则是什么?

4

1 回答 1

2

由于设备上不允许使用 JITin,所有代码都必须使用 AOT(提前)编译器进行编译。

我的理解是不允许这样的代码:

对于 AOT 编译器来说,这个限制是关于确定在运行时将使用什么的困难。这样的代码可能会起作用,您会在示例中看到这样的代码 - 但它也可能会失败,具体取决于您对代码所做的事情(创建 aDictionary不是问题)。

那么在设备上使用字典的真正规则是什么?

使用值类型意味着生成的代码不能共享(就像引用类型一样)。例如,使用泛型Dictionarywith intand long需要单独的代码,而相同的代码可以用于stringand CustomCellController

找到Dictionary<int,int>需要的东西不是问题(很清楚)。然而,事情往往在内部变得复杂,例如确保KeyValuePair生成正确的权利。嵌套泛型也很难正确。

这就是为什么第一个通用解决方法是尝试向AOT 编译器提示需要什么。如果 AOT 编译器可以找到需要它来生成所需内容的代码,那么它将在运行时可用。

下一个解决方法是尝试使用引用类型(例如 a string)而不是值类型(因为这种情况对于 AOT 编译器来说更容易处理)。

最后,AOT 编译器正在变得更好(每个版本),并且工作继续减少这个(和其他)限制。因此,您在此处阅读的内容可能不适用于 3、6、12 个月……

于 2012-10-29T12:23:45.150 回答