2012-02-21 13 views
15

mam nazwę zderzeniu problem podczas otwierania niektórych zespołów .Net w moim F # kodu za pomocąAlias ​​w przestrzeni nazw w F #?

open System.IO 

jedyną opcją znalazłem i teraz używać świadczyć pełne nazwy typów dla sprzecznych rodzajów, ale jest to trochę nudne.

Czy istnieje możliwość zdefiniowania aliasu dla przestrzeni nazw .Net w F #, aby zapobiec zderzaniu się nazw?

Odpowiedz

27

F # nie obsługuje aliasingu przestrzeni nazw - tylko moduły i typy. Tak więc, aby rozwiązać konflikty między zespołami .NET, niestety trzeba zdefiniować aliasy dla wszystkich typów, których używasz.

Może to być nieco łatwiejsze dzięki temu, że aliasy typu F # są wyświetlane jako normalne deklaracje typów (przez kompilator F #, a nie przez środowisko wykonawcze). Oznacza to, że w przeciwieństwie do C# using hasła, można je zdefiniować w pliku 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 

W pozostałej części aplikacji, można teraz używać SysIO.File. Nadal musisz pisać aliasy, ale przynajmniej nie musisz tego robić w każdym pliku ...

+1

To jest dobre rozwiązanie, potrzebuję tylko garstki typów. –

+0

"tylko moduły i typy": są to tylko typy, moduły nie mogą być aliasowane. byłby szczęśliwie zły. – citykid

+2

szczęśliwie się mylę. moduły mogą być aliasowane w następujący sposób: moduł ACMEStore = ACME.DB.Store (http://stackoverflow.com/questions/3918744/how-to-use-namespace- or-type-alias-abbreviation) – citykid