MonoTouch:关于值类型作为词典键

时间:2013-01-15 06:09:22

标签: c# ios xamarin.ios

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

1 个答案:

答案 0 :(得分:8)

  

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

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

Apple不允许在设备上进行JIT(及时)编译。这意味着在部署到设备之前,必须预先编译所有内容(提前)。这意味着MonoTouch存在少量limitations,而你不会使用.NET / Mono或Mono for Android。

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

在某些情况下,AOT编译器可能无法检测运行时可能所需的每种可能类型。这将导致EngineExecutionException指向违规代码。

在此阶段,您可以尝试:

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

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

  

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

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

嵌套泛型或使用代码时(例如,带有值类型的LINQ查询可以生成此类代码)通常会出现问题。