为什么F#Core定义通用数组类型?


11

我刚刚注意到FSharp.Core命名空间包括最多4维的通用数组类型,即Core。[] <'T>,Core。[,] <'T>等。C#和VB看起来做的很好使用System.Array-尽管我不清楚它们如何支持强类型的专用数组类型,例如int [],string []。

我想这将成为两个问题:

  • C#如何基于非泛型System.Array支持强类型的专用数组类型,如int []?
  • 鉴于C#可以做到这一点,为什么F#定义通用数组类型?

Answers:


8

F#本身没有定义通用数组类型。F#中的数组与.NET其余部分使用的数组类型相同,尽管所有句法证据都指出与此相反,但它们不是通用的。

当您在F#中使用反射时,这有时会适得其反-即使您拥有一个array<int>看起来是完全有效的泛型类型,当您检查它时,您也会从中得到false,从中得到IsGenericTypetrue IsArray,并且得到type参数用GetElementType而不是GetGenericArguments

就像Telastyn在回答中指出的那样,这很可能是我们必须忍受的.NET 1.0的旧包。但这只是使F#中使用反射API成为真正的雷区的众多事情之一。

F#定义的是[], [,] ...类型缩写词/别名/运算符和具有相应功能的模块,但是它们最终都引用了下面的同一数组类型。

您可以在这里这里查看github上的源代码,亲自查看。


但是这些被列为实类型,而不是类型别名。我很困惑,因为msdn.microsoft.com/zh-cn/library/dd233214.aspx说“所有F#数组的类型都是.NET Framework类型Array”,但是System.Array与FSharp之间的关系又是什么? 。核心通用数组?
阿西克

没有泛型数组;)从技术上讲,它们可能是实型,这就是msdn doc生成器选择它们的原因,但是它们定义的就是,如果我正确地读入它,编译器应该如何扩展它们(我链接的第一个文件) ,以及第二个文件中的几种扩展方法。这里的所有都是它的。创建其中之一并在其上调用GetType。这将是基于System.Array的专用数组类型。
scrwtp 2014年

更确切地说,静态类型本身是通用的,但它们包装的运行时数组类型却不是。也许以这种方式实现类型推断稍微容易一些,但这是一个疯狂的猜测。
scrwtp 2014年

5

C#如何基于非泛型System.Array支持强类型的专用数组类型,如int []?

System.Array由于泛型在1.0中不可用,因此很有可能通过生成一个继承自该类的专用类。该行为可能是为了保持兼容性而保留的。

鉴于C#可以做到这一点,为什么F#定义通用数组类型?

因为F#与现有代码在C#2.0中没有相同的兼容性约束。根据我的了解,如果C#2.0是C#的第一个发行版,它将具有通用数组类型。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.