MonoTouch documentation声明它不支持虚拟通用方法。
但是,在我的MonoTouch项目中,我有类
public class ListMaker<T>
{
public ListMaker() {}
public virtual List<T> MakeList(T t1, T t2)
{
return new List<T>{t1, t2};
}
}
public class ReverseListMaker<T> : ListMaker<T>
{
public ReverseListMaker() {}
public override List<T> MakeList(T t1, T t2)
{
return new List<T>{t2, t1};
}
}
和其他地方......
ListMaker<string> lm = new ReverseListMaker<string>();
List<string> strings = lm.MakeList("hello", "world");
现在,我的期望是这不应该编译。但是,它正在iOS模拟器上进行编译和运行。
该限制是否仅适用于设备的实际ARM架构?或者文档是否过时了?
答案 0 :(得分:4)
简答:
该限制是否仅适用于设备的实际ARM架构?
是
或者文档是否已过时?
没有
答案很长:
大多数MonoTouch limitations都是由所有应用程序必须遵循的规则决定才能在iOS 设备上运行。
这包括对泛型的一些限制,因为 AOT (提前)编译器无法知道需要生成哪些代码的每种可能情况。
然而,由于规则仅适用于设备,并且AOT编译需要相当长的时间,因此MonoTouch将在使用时使用 JIT (即时)编译器模拟器。这样可以实现更快的代码构建调试周期,并使开发更多更加愉快。缺点是这可能会隐藏一些限制(如AOT的限制)。
然而,在很多情况下,iOS模拟器的行为与设备有很大不同。 IOW在模拟器上工作的东西并不意味着它可以在设备上工作(至少同样很好或根本没有)。因此,所有(或大多数)测试应该在(如果可能的话,许多不同的)设备上进行。
答案 1 :(得分:0)
这不是通用方法,它是泛型类型的方法。它在模拟器和设备上都很好。如果在该方法中有另一个泛型类型参数(并将方法保持为虚拟),那么它将无法在模拟器或设备上运行。