2010-06-28 13 views
10

J'utilise des types F # (Matrix et al) de C# et je dois donc référencer l'assembly FSharp.Core dans mon projet C#. Jusqu'ici tout va bien.Y compris FSharp.Core dans un projet C#: résoudre les collisions de type

Cependant, il existe apparemment certains types définis dans mscorlib.dll (v4) qui sont "dupliqués" dans FSharp.Core (v2), comme System.Tuple et System.IObservable. Je ne comprends pas pourquoi cela est en .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.

Je suis prêt à regarder au-delà de cette double emploi particulier inconvenant si je pouvais préciser lequel je veux utiliser dans mon programme C#, mais . Lorsque je tente d'utiliser le type System.Tuple, par exemple, je reçois le texte suivant C# erreur du compilateur:

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'

La façon de contourner cela, apparemment, est 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

Cependant, je ne peux pas trouver un moyen d'obtenir Visual Studio pour envoyer ce paramètre au compilateur C#.

Quelqu'un at-il une solution à ce problème?

Répondre

12

Vous devez faire référence à la version 4.0 de l'exécution F #. Cette version correspond à la version 4.0 de mscorlib et ne possède pas les types en conflit. Ils seront dans ce répertoire

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

+0

Notez que la version 4.0 réside dans 'c: \ Program Files (x86) \ Assemblys de référence \ Microsoft \ FSharp \ 2.0 \ Runtime \ v4.0 \ FSharp.Core.dll». Avez-vous utilisé 'ajouter une référence' pour obtenir la référence? Je me demande comment vous avez fini par référencer le 2.0 dans un projet 4.0 en premier lieu. – Brian

+0

Oui, j'ai utilisé "Ajouter une référence" pour obtenir ceci ... cependant, j'ai le VS PowerTools avec la boîte de dialogue Ajouter une référence de meilleure conception installée, donc cela pourrait être le problème. – codekaizen

+0

@Brian, grattez ça. Je dois y avoir navigué, et je n'ai tout simplement pas compris que F # v2.0 peut également cibler le CLRv2, et a donc deux ensembles d'assemblages différents. – codekaizen

3

Vous pouvez résoudre les conflits en utilisant C# assembly aliases et assemblage de la source de qualification explicitement dans le code C#: par exemple si vous avez le type Tuple défini à la fois dans l'assemblage F # et vous bibliothèques.

+0

C'est cool, et je ne connaissais pas le 'extern alias' en C#, mais il note aussi qu '"un alias doit être spécifié sur la ligne de commande", ce qui semble être, au mieux, obscur et peu pratique en Visual Studio. – codekaizen

+1

VS prend en charge cette fonctionnalité: vous pouvez spécifier un alias dans les propriétés de la référence d'assemblage – desco

+0

Wow. Cool! Merci pour le bon conseil. +1 – codekaizen