Perché F # Core definisce i tipi di array generici?


11

Ho appena notato che lo spazio dei nomi FSharp.Core include tipi di array generici fino a 4 dimensioni, ad esempio Core. [] <'T> , Core. [,] <' T>, ecc. C # e VB sembrano andare bene con System.Array - sebbene non mi sia chiaro come riescano a supportare tipi di array specializzati fortemente tipizzati come int [], string [].

Immagino che questo diventi due domande allora:

  • In che modo C # supporta tipi di array specializzati fortemente tipizzati come int [] basato su System.Array non generico?
  • Dato che C # riesce a farlo, perché F # definisce i tipi di array generici?

Risposte:


8

F # non definisce i tipi di array generici di per sé. Le matrici in F # sono dello stesso tipo di array che il resto di .NET utilizza e, nonostante tutte le prove sintattiche che indicano il contrario, non sono generiche.

Questo a volte può ritorcersi contro di te quando stai usando la riflessione in F # - anche se ne hai uno array<int>che sembra essere un tipo generico perfettamente valido, quando lo controlli ottieni un falso da IsGenericType, un vero da IsArraye ottieni l'argomento type con GetElementTypepiuttosto allora GetGenericArguments.

Come Telastyn ha notato nella sua risposta, questo è probabilmente il bagaglio legacy di .NET 1.0 con cui dovremo convivere. Ma è solo una delle tante cose che rende l'utilizzo dell'API di riflessione in F # un vero campo minato.

Ciò che F # definisce, sono le [], [,] ...abbreviazioni dei tipi / alias / operatori e moduli con funzioni corrispondenti, ma alla fine si riferiscono tutti allo stesso tipo di array sottostante.

Puoi vedere il codice sorgente su github qui e qui per vederlo da solo.


Ma questi sono elencati come tipi reali, non come alias. Sono confuso perché msdn.microsoft.com/en-us/library/dd233214.aspx dice "Il tipo di tutti gli array F # è l'array di tipo .NET Framework", ma allora qual è la relazione tra System.Array e FSharp .Core array generici?
Asik,

Non ci sono array generici;) Potrebbero essere tipi reali tecnicamente, ed è per questo che il generatore di documenti msdn li ha raccolti, ma tutto ciò che definiscono è come il compilatore dovrebbe espanderli, se li leggo correttamente (il primo file che ho collegato) e un paio di metodi di estensione nel secondo file. Questo è tutto quello che c'è da fare. Creane uno e chiama GetType su di esso. Sarà un tipo di array specializzato basato su System.Array.
scrwtp,

O meglio, i tipi statici stessi sono generici, ma non il tipo di array di runtime che stanno avvolgendo. Forse implementare l'inferenza di tipo è leggermente più semplice in questo modo, ma questa è un'ipotesi selvaggia.
scrwtp,

5

In che modo C # supporta tipi di array specializzati fortemente tipizzati come int [] basato su System.Array non generico?

Molto probabilmente, generando una classe specializzata che eredita da System.Arrayquando i generici non erano disponibili in 1.0. Il comportamento è stato probabilmente mantenuto per compatibilità.

Dato che C # riesce a farlo, perché F # definisce i tipi di array generici?

Perché F # non aveva gli stessi vincoli di compatibilità che C # 2.0 aveva con il codice esistente. Sulla base di ciò che so, C # 2.0 avrebbe avuto tipi di array generici se fosse stata la prima versione di C #.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.