我对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?>();
这也没有意义,因为可空类型是值类型的结构。
那么在设备上使用词典的真正规则是什么?
答案 0 :(得分:2)
由于设备上不允许使用JITin,因此必须使用AOT(提前)编译器编译所有代码。
我理解不允许这样的代码:
这个限制是关于AOT编译器确定在运行时将使用什么的困难。这样的代码可能会起作用,你会在样本中看到这样的代码 - 但它也会失败,这取决于你对代码的处理方式(创建Dictionary
不是问题)。
那么在设备上使用词典的真正规则是什么?
使用值类型意味着无法共享生成的代码(就像引用类型一样)。例如。对Dictionary
和int
使用通用long
需要单独的代码,而string
和CustomCellController
可以共享相同的代码。
找出Dictionary<int,int>
需要的不是问题(很明显)。然而,事情往往在内部,事情变得复杂,例如确保生成正确的KeyValuePair
。嵌套的泛型也很难做对。
这就是为什么第一个一般的解决方法是尝试提示 AOT编译器关于所需的内容。如果AOT编译器可以找到需要它来生成所需内容的代码,那么它将在运行时可用。
下一个解决方法是尝试使用引用类型(例如string
)而不是值类型(因为这种情况对于AOT编译器来说更容易处理)。
最后,AOT编译器越来越好(每个版本),并继续减少此(和其他)限制。所以你在这里读到的内容可能不适用于3,6,12个月......