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?

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 .


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.