2012-03-04 86 views
1

MonoTouch documentation指出它不支持虚拟通用方法。MonoTouch一般限制和iOS模拟器

然而,在我的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体系结构?还是文档过时了?

回答

4

简短回答:

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

或者是文档已经过时?

没有

龙答:

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

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

但是因为规则只适用于设备和AOT编译需要相当长一段时间在模拟器上使用时,MonoTouch的将使用JIT(刚刚在时间)编译器。这允许更快的代码构建 - 调试周期并使开发更多愉快。缺点是这可以隐藏一些限制(如AOT的限制)。

尽管如此,iOS模拟器的行为与设备的行为有很多不同。 IOW在模拟器上工作的东西并不意味着它可以在设备上工作(至少很好或完全一样)。因此,所有(或大部分)测试都应该在(如果可能的话)许多不同的设备上完成。

+0

这是一个泛型类型的方法,但它不是一个通用的方法......你确定它在MonoTouch上不起作用吗? – Guillaume 2013-02-22 09:14:01

0

这不是一个通用的方法,它是一种泛型类型的方法。在模拟器和设备上没问题。如果在该方法中有另一个泛型类型参数(并且保持该方法为虚拟),那么它在模拟器或设备上不起作用。