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体系结构吗?还是文档过时了?
最佳答案
简短答案:
该限制仅适用于设备的实际ARM体系结构吗?
是
还是文档过时了?
没有
长答案:
大多数MonoTouch limitations由以下规则所规定:所有应用程序必须遵循这些规则才能在iOS 设备上运行。
这包括对泛型的一些限制,因为 AOT (提前)编译器无法知道需要生成代码的所有可能情况。
但是,由于规则仅适用于设备,并且AOT编译需要花费一些时间,因此在模拟器上使用时,MonoTouch将使用 JIT (即时)编译器。这样可以加快代码构建-调试周期的速度,并使开发更加有趣。缺点是,这可能会隐藏一些限制(例如AOT的限制)。
但是,在许多情况下,iOS模拟器的行为与设备的行为截然不同。 IOW可以在模拟器上运行的东西并不意味着它(至少可以很好地或完全不能)在设备上运行。因此,所有(或大多数)测试应在(如果可能的话,许多不同的)设备上进行。
关于ios - MonoTouch通用限制和iOS模拟器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9551524/