Warum definiert F # Core generische Array-Typen?

11

Ich habe gerade bemerkt, dass der FSharp.Core-Namespace generische Array-Typen mit bis zu 4 Dimensionen enthält, dh Core. [] <'T> , Core. [,] <' T> usw. C # und VB scheinen in Ordnung zu sein mit System.Array - obwohl mir nicht klar ist, wie sie stark typisierte spezialisierte Array-Typen wie int [], string [] unterstützen.

Ich denke, das werden dann zwei Fragen:

  • Wie unterstützt C # stark typisierte spezialisierte Array-Typen wie int [], die auf dem nicht generischen System.Array basieren?
  • Warum definiert F # generische Array-Typen, wenn C # dies schafft?
Asik
quelle

Antworten:

8

F # definiert keine generischen Array-Typen an sich. Arrays in F # sind derselbe Array-Typ, den Rest von .NET verwendet, und trotz aller syntaktischen Beweise, die auf das Gegenteil hinweisen, sind sie nicht generisch.

Dies kann manchmal nach hinten losgehen, wenn Sie Reflection in F # verwenden - selbst wenn Sie einen array<int>Typ haben, der als vollkommen gültiger generischer Typ erscheint. Wenn Sie ihn untersuchen, erhalten Sie ein false from IsGenericType, ein true from IsArrayund das type-Argument mit GetElementTypeeher dann GetGenericArguments.

Wie Telastyn in seiner Antwort feststellte, ist dies wahrscheinlich das alte Gepäck von .NET 1.0, mit dem wir leben müssen. Aber es ist nur eines von vielen Dingen, die die Verwendung der Reflection API in F # zu einem echten Minenfeld machen.

Was F # definiert, sind die [], [,] ...Typabkürzungen / Aliase / Operatoren und Module mit entsprechenden Funktionen, aber alle beziehen sich letztendlich auf denselben Array-Typ darunter.

Sie können den Quellcode auf github hier und hier ansehen, um sich selbst davon zu überzeugen .

scrwtp
quelle
Diese werden jedoch als echte Typen aufgeführt, nicht als Typ-Aliase. Ich bin verwirrt, weil msdn.microsoft.com/en-us/library/dd233214.aspx sagt "Der Typ aller F # -Arrays ist das Array vom Typ .NET Framework", aber wie ist dann die Beziehung zwischen System.Array und FSharp? .Kern generische Arrays?
Asik
Es gibt keine generischen Arrays;) Sie könnten technisch gesehen echte Typen sein, und deshalb hat msdn doc generator sie aufgenommen, aber alles, was sie definieren, ist, wie der Compiler sie erweitern soll, wenn ich sie richtig einlese (die erste Datei, die ich verlinkt habe). und einige Erweiterungsmethoden in der zweiten Datei. Das ist alles dazu. Erstellen Sie eine davon und rufen Sie GetType auf. Es wird ein spezialisierter Array-Typ sein, der auf System.Array basiert.
Scrwtp
Oder besser gesagt, die statischen Typen selbst sind generisch, der Laufzeit-Array-Typ, den sie umschließen, jedoch nicht. Vielleicht ist die Implementierung von Typinferenz auf diese Weise etwas einfacher, aber das ist eine wilde Vermutung.
scrwtp
5

Wie unterstützt C # stark typisierte spezialisierte Array-Typen wie int [], die auf dem nicht generischen System.Array basieren?

Sehr wahrscheinlich durch Generieren einer speziellen Klasse, die erbt, System.Arrayda Generika in 1.0 nicht verfügbar waren. Das Verhalten wurde wahrscheinlich aus Kompatibilitätsgründen beibehalten.

Warum definiert F # generische Array-Typen, wenn C # dies schafft?

Weil F # nicht die gleichen Kompatibilitätsbeschränkungen hatte wie C # 2.0 mit vorhandenem Code. Nach meinem Wissen hätte C # 2.0 generische Array-Typen gehabt, wenn es die erste Version von C # gewesen wäre.

Telastyn
quelle