为何泛型TArray的Create语法与其他类函数存在差异?
为什么Delphi中TArray的Create和Sort泛型语法不一致?
这个问题确实戳中了Delphi泛型设计里一个容易让人困惑的细节,我当初刚接触的时候也盯着代码愣了好一会儿!其实这种差异是有明确设计逻辑的,核心在于这两种调用的本质完全不同:
TArray<Integer>.Create(...)的本质:实例化泛型类
TArray本身是一个泛型类定义,TArray<Integer>是把这个泛型类“具体化”成了针对Integer类型的数组类。Create是这个具体化后的类的构造函数,所以必须先通过<Integer>指定类的泛型参数,得到具体的类后,才能调用它的构造函数创建实例。类似的例子还有
TList<String>.Create()——你得先告诉编译器你要的是字符串类型的List类,才能调用它的构造。TArray.Sort<Integer>(...)的本质:调用泛型静态方法
Sort是TArray类的一个静态泛型方法,这个方法本身带有独立的泛型参数,和TArray类自身的泛型定义无关。你不需要先实例化某个TArray<T>类,直接通过类名TArray调用这个工具方法即可,而<Integer>是用来指定这个Sort方法要处理的数组类型,所以要放在方法名后面。简单说:这里的泛型参数是给Sort方法用的,不是给整个TArray类用的。
总结一下,Delphi的泛型语法规则其实是统一的:
- 如果是调用泛型类的成员,需要先在类名后指定类型参数,把类具体化后再调用成员;
- 如果是调用类的泛型静态方法,类型参数直接放在方法名后,因为参数是属于方法本身的。
内容的提问来源于stack exchange,提问作者Fabrizio
相关产品推荐
相关产品推荐

