4

它说使用值类型作为字典键会“在设备上很快崩溃和烧毁”,这是否意味着我不能使用 Dictionary<int, string> 之类的东西来制作字符串查找表?

4

1 回答 1

8

它说使用值类型作为字典键将“在设备上很快崩溃和烧毁”,

它不是那么戏剧化(没有燃烧)或那么自动 - 但它可能会发生。

Apple 不允许在设备上进行 JIT(即时)编译。这意味着在部署到设备之前,必须(提前)预编译所有内容。这意味着MonoTouch 存在一些限制,而 .NET / Mono 或 Mono for Android 则没有这些限制。

一般来说,生成泛型代码可以在不同类型之间共享。遗憾的是,这对于值类型是不可能的。这意味着 AOT(提前)编译器必须为正在使用的每种值类型生成代码。

在某些情况下,AOT 编译器可能无法检测到运行时可能需要的所有可能类型。这将导致EngineExecutionException将您指向有问题的代码。

在这个阶段,您可以尝试:

  • 提示AOT 编译器需要该代码(即添加一些代码,使 AOT 编译器生成所需的缺失代码);或者

  • 重构代码,例如避免值类型;

这是否意味着我不能使用 Dictionary 之类的东西来制作字符串查找表?

不,这会奏效。当您创建Dictionary<int, string>then 的实例时,AOT 编译器很容易知道需要生成哪些代码。

问题通常发生在嵌套泛型或使用这样做的代码时(例如,具有值类型的 LINQ 查询可以生成此类代码)。

于 2013-01-15T16:55:55.263 回答