为什么通用 TArray Create 语法与其他 class 函数不同?

Why does generic TArray Create syntax differs from other class functions?

我注意到一些在我看来是通用 TArray 语法中的不一致之处(让我抓狂...)

调用"constructor"函数需要在函数名前指定类型

MyArray := TArray<Integer>.Create(3, 2, 1);

其他class函数需要在函数名

后指定类型调用
TArray.Sort<Integer>(MyArray);

他们这样做有实际原因吗?

第一个TArrayarray of T的系统类型定义。创作也可以这样写:

MyArray := [3,2,1]; 

第二个 TArray 是 Generics.Collections 中定义的 class。

他们没有任何关系。


另请注意,TArray class 使用泛型的方式称为 Parameterized Methods

Type
  TArray = class
    ...
    class procedure Sort<T>(var Values: array of T); overload; static;
    ...
  end; 

这是一种减少代码重复的方法。

泛型数组是这样定义的

TArray<T> = array of T;

这是动态数组的别名。动态数组有一个内在的 Create 方法。甚至是非通用的。

type
  TMyDynArr = array of Integer;
....
arr := TMyDynArr.Create(0, 1, 2);

Create 方法是编译器固有的。注意它如何接受任意数量的参数。

另一方面,有 class TArray,它具有通用的 Sort 方法。这是在 RTL 中实现的。请记住 TArray 永远不会实例化,它只是通用 class 方法的集合。

我的猜测是,向动态数组类型添加方法需要编译器支持,因为它们是内部函数。但是添加到 TArray 更简单,因为它是在 RTL 层完成的,不需要编译器支持。

在这里您无能为力,因此为此烦恼也无济于事。你无法改变它。习惯就好了。