MonoTouch通用限制和iOS模拟器

时间:2012-03-04 01:31:32

标签: ios xamarin.ios ios-simulator

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架构?或者文档是否过时了?

2 个答案:

答案 0 :(得分:4)

简答:

  

该限制是否仅适用于设备的实际ARM架构?

  

或者文档是否已过时?

没有

答案很长:

大多数MonoTouch limitations都是由所有应用程序必须遵循的规则决定才能在iOS 设备上运行。

这包括对泛型的一些限制,因为 AOT (提前)编译器无法知道需要生成哪些代码的每种可能情况。

然而,由于规则仅适用于设备,并且AOT编译需要相当长的时间,因此MonoTouch将在使用时使用 JIT (即时)编译器模拟器。这样可以实现更快的代码构建调试周期,并使开发更多更加愉快。缺点是这可能会隐藏一些限制(如AOT的限制)。

然而,在很多情况下,iOS模拟器的行为与设备有很大不同。 IOW在模拟器上工作的东西并不意味着它可以在设备上工作(至少同样很好或根本没有)。因此,所有(或大多数)测试应该在(如果可能的话,许多不同的)设备上进行。

答案 1 :(得分:0)

这不是通用方法,它是泛型类型的方法。它在模拟器和设备上都很好。如果在该方法中有另一个泛型类型参数(并将方法保持为虚拟),那么它将无法在模拟器或设备上运行。