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

11

Ho appena notato che lo spazio dei nomi di FSharp.Core include tipi di array generici di fino a 4 dimensioni, ovvero Core . [] < 'T > , Core. [] <' T & gt ;, ecc. C # e VB sembrano funzionare bene con System.Array - anche se non mi è chiaro come riescano a supporta tipi di array specializzati strongmente tipizzati come int [], string [].

Credo che questo diventi due domande:

  • In che modo C # supporta tipi di array specializzati strongmente tipizzati come int [] basato su System.Array non generico?
  • Dato che C # riesce a farlo, perché F # definisce tipi di array generici?
posta Asik 02.07.2014 - 19:31
fonte

2 risposte

8

F # non definisce i tipi di array generici di per sé. Le matrici in F # sono lo stesso tipo di array resto degli usi .NET, e nonostante tutte le prove sintattiche che puntano al contrario, non sono generiche.

Questo a volte può essere controproducente quando si utilizza il reflection in F # - anche se si ha un array<int> che sembra essere un tipo generico perfettamente valido, quando lo si ispeziona si ottiene un falso da IsGenericType , un true da IsArray , e ottieni l'argomento type con GetElementType piuttosto che GetGenericArguments .

Come Telastyn ha notato nella sua risposta, questo è probabilmente il bagaglio precedente 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 / alias / operatori di [], [,] ... e i moduli con le funzioni corrispondenti, ma alla fine si riferiscono allo stesso tipo di array sottostante.

Puoi guardare il codice sorgente su github qui e qui per vederlo per te.

    
risposta data 02.07.2014 - 20:43
fonte
5

How does C# support strongly-typed specialized array types like int[] based on the non-generic System.Array?

Molto probabilmente, generando una classe specializzata che eredita da System.Array poiché i generici non erano disponibili in 1.0. È probabile che il comportamento sia stato mantenuto per compatibilità.

Given that C# manages to do this, why does F# define generic array types?

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 la prima versione di C #.

    
risposta data 02.07.2014 - 20:01
fonte

Leggi altre domande sui tag