我刚刚注意到FSharp.Core命名空间包括最多4维的通用数组类型,即Core。[] <'T>,Core。[,] <'T>等。C#和VB看起来做的很好使用System.Array-尽管我不清楚它们如何支持强类型的专用数组类型,例如int [],string []。
我想这将成为两个问题:
- C#如何基于非泛型System.Array支持强类型的专用数组类型,如int []?
- 鉴于C#可以做到这一点,为什么F#定义通用数组类型?
我刚刚注意到FSharp.Core命名空间包括最多4维的通用数组类型,即Core。[] <'T>,Core。[,] <'T>等。C#和VB看起来做的很好使用System.Array-尽管我不清楚它们如何支持强类型的专用数组类型,例如int [],string []。
我想这将成为两个问题:
Answers:
F#本身没有定义通用数组类型。F#中的数组与.NET其余部分使用的数组类型相同,尽管所有句法证据都指出与此相反,但它们不是通用的。
当您在F#中使用反射时,这有时会适得其反-即使您拥有一个array<int>
看起来是完全有效的泛型类型,当您检查它时,您也会从中得到false,从中得到IsGenericType
true IsArray
,并且得到type参数用GetElementType
而不是GetGenericArguments
。
就像Telastyn在回答中指出的那样,这很可能是我们必须忍受的.NET 1.0的旧包。但这只是使F#中使用反射API成为真正的雷区的众多事情之一。
F#定义的是[], [,] ...
类型缩写词/别名/运算符和具有相应功能的模块,但是它们最终都引用了下面的同一数组类型。