2010-06-28 5 views
10

Sto utilizzando alcuni tipi di F # (Matrix et al) da C# e quindi ho bisogno di fare riferimento all'assembly FSharp.Core nel mio progetto C#. Fin qui tutto bene.Incluso FSharp.Core in un progetto C#: risoluzione delle collisioni di tipo

Tuttavia, ci sono alcuni tipi definiti in mscorlib.dll (v4) che sono "duplicati" in FSharp.Core (v2), come System.Tuple e System.IObservable. Non riesco a capire perché questo è in Net 4. Matt Ellis specifically said they would be removed in his MSDN article:

One language suffering that [duplication] problem was F#, which previously had defined its own tuple type in FSharp.Core.dll but will now use the tuple added in Microsoft .NET Framework 4.

sono pronto a guardare oltre questo particolare duplicazione sconveniente se solo potessi specificare quale voglio usare nel mio programma C#, invece . Quando cerco di utilizzare il tipo System.Tuple, per esempio, ricevo il seguente errore di compilatore C#:

Error 2 The type 'System.Tuple' exists in both 'c:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.0\Profile\Client\mscorlib.dll' and 'c:\Program Files (x86)\Reference Assemblies\Microsoft\FSharp\2.0\Runtime\v2.0\FSharp.Core.dll'

Il modo per aggirare questo, a quanto pare, è a switch on the C# compiler command line which aliases the type:

csc.exe MyType.cs /reference:System.Tuple`2=mscorlib.dll /reference:FSharp.Core.dll

Tuttavia, non posso trovare un modo per ottenere Visual Studio per inviare questo parametro al compilatore C#.

Chiunque ha una soluzione a questo?

risposta

12

È necessario fare riferimento alla versione 4.0 del runtime F #. Questa versione corrisponde alla versione 4.0 di mscorlib e non ha i tipi in conflitto. Saranno in questa directory

C:\Program Files (x86)\Reference Assemblies\Microsoft\FSharp\2.0\Runtime\v4.0

+0

Si noti che la versione 4.0 risiede in 'c: \ Programmi (x86) \ Reference Assemblies \ Microsoft \ FSharp \ 2.0 \ Runtime \ v4.0 \ FSharp.Core.dll'. Hai usato 'aggiungi riferimento' per ottenere il riferimento? Mi chiedo come sei finito a fare riferimento a quello 2.0 in un progetto 4.0, in primo luogo. – Brian

+0

Sì, ho usato "Aggiungi riferimento" per ottenere questo ... tuttavia, ho VS PowerTools con la finestra di dialogo Aggiungi riferimento progettato meglio, quindi questo potrebbe essere il problema. – codekaizen

+0

@ Brian, gratta quello. Devo averlo sfogliato e non ho capito che F # v2.0 può anche indirizzare il CLRv2 e quindi ha due gruppi diversi di assiemi. – codekaizen

3

È possibile risolvere i conflitti utilizzando C# assembly aliases e montaggio fonte qualifica esplicitamente nel codice C#: ad esempio, se si dispone di tipo tuple definito sia in F # di assemblaggio e in voi librerie.

+0

Questo è interessante, e non conoscevo l'alias esterno in C#, ma nota anche che "un alias deve essere specificato sulla riga di comando", che sembra essere, nel migliore dei casi, oscuro e poco pratico in Visual Studio. – codekaizen

+1

VS supporta questa funzione: è possibile specificare l'alias nelle proprietà del riferimento di assieme – desco

+0

Wow. Freddo! Grazie per l'ottimo consiglio. +1. – codekaizen

Problemi correlati