2012-02-21 19 views
15

Ho un nome scontrandosi problema durante l'apertura di alcuni assembly .NET nel mio codice F # utilizzandoAlias ​​di spazi dei nomi in F #?

open System.IO 

L'unica opzione che ho trovato e utilizzare ora è quello di fornire i nomi completi dei tipi per i tipi di conflitto, ma questo è un un po 'noioso.

Esiste la possibilità di definire un alias per lo spazio dei nomi .Net in F # per evitare conflitti tra i nomi?

risposta

27

F # non supporta l'aliasing di spazi dei nomi, solo moduli e tipi. Quindi, per risolvere i conflitti tra gli assembly .NET, sfortunatamente dovrai definire gli alias per tutti i tipi che stai utilizzando.

Questo può essere leggermente più semplice grazie al fatto che gli alias di tipo F # vengono visualizzati come normali dichiarazioni di tipo (dal compilatore F #, non dal runtime). Ciò significa che, a differenza di C# using parola chiave, è possibile definirli in un file spearate:

// Aliases.fs 
namespace SysIO 

// Open the 'System' namespace to get a bit shorter syntax 
// ('type File = File' is interpreted as discriminated union) 
open System 

type File = IO.File 
type Directory = IO.Directory 

Nel resto della vostra applicazione, è ora possibile utilizzare SysIO.File. Devi ancora scrivere gli alias, ma almeno non devi farlo in ogni file ...

+1

Questa è una bella soluzione, ho solo bisogno di una manciata di tipi. –

+0

"solo moduli e tipi": sono solo tipi, i moduli non possono essere sottoposti a aliasing. sarebbe felicemente sbagliato. – citykid

+2

felicemente sbagliato sono io. i moduli possono essere sottoposti ad alias in questo modo: modulo ACMEStore = ACME.DB.Store (http://stackoverflow.com/questions/3918744/how-to-use-namespace-or-type-alias-abbreviation) – citykid