【发布时间】:2011-11-18 19:26:49
【问题描述】:
我目前有一些代码如下所示,它们使用 Linq 为我组织一些 IEnumerables。在以发布模式(iOS 5.0.1、MonoTouch 5.0.1、Mono 2.10.6.1)在设备上执行此代码时,出现异常
在使用 --aot-only 运行时尝试 JIT 编译方法“System.Linq.OrderedEnumerable`1:GetEnumerator()”。
产生这个错误的代码是
// List<IncidentDocument> documents is passed in
List<LibraryTableViewItemGroup> groups = new List<LibraryTableViewItemGroup>();
List<DocumentObjectType> categories = documents.Select(d=>d.Type).Distinct().OrderBy(s=>s.ToString()).ToList();
foreach(DocumentObjectType cat in categories)
{
List<IncidentDocument> catDocs = documents.Where(d => d.Type == cat).OrderBy(d => d.Name).ToList();
List<LibraryTableViewItem> catDocsTableItems = catDocs.ConvertAll(d => { return new LibraryTableViewItem{ Image = GetImageForDocument(d.Type), Title = d.Name, SubTitle = d.Description}; });
LibraryTableViewItemGroup catGroup = new LibraryTableViewItemGroup{ Name = GetCatName(cat), Footer = null, Items = catDocsTableItems };
groups.Add (catGroup);
}
此错误不会发生在用于发布|调试配置的模拟器或用于调试配置的设备上。我在 SO here 和 here 上看到了几个类似的主题,但我不确定我是否理解它们在这个特定问题上如何适用于我。
【问题讨论】:
-
在我看来,我正在告诉编译器 AOT 一切,所以它不需要事先发现类型吗?我看到了解决方法,但我不明白为什么它们仅在发布/设备中是必需的。如果我告诉 Linq 生成一个具体类型的列表,例如
.ToList<DocumentObjectType>()而不是.ToList(),是否足以让编译器正确地 AOT 这些类型? -
不,因为问题是 IOrderedEnumerable
,而不是 List 。虽然我不知道如何在没有 orderby 的情况下创建 IOrderedEnumerable ..
标签: ios linq mono xamarin.ios aot