views:

118

answers:

2

I'm using some F# types (Matrix et al) from C# and so I need to reference the FSharp.Core assembly in my C# project. So far, so good.

However, there are apparently some types defined in mscorlib.dll (v4) which are "duplicated" in FSharp.Core (v2), like System.Tuple and System.IObservable. I can't understand why this is 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.

I'm ready to look past this particular unseemly duplication if I could just specify which one I want to use in my C# program, however. When I try to use the System.Tuple type, for example, I get the following C# compiler error:

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'

The way around this, apparently, is 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

However, I can't find a way to get Visual Studio to send this parameter to the C# compiler.

Anyone have a solution to this?

+6  A: 

You need to reference the 4.0 version of the F# runtime. This version corresponds with the 4.0 version of mscorlib and does not have the conflicting types. They will be in this directory

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

JaredPar
Note that the 4.0 version lives in `c:\Program Files (x86)\Reference Assemblies\Microsoft\FSharp\2.0\Runtime\v4.0\FSharp.Core.dll`. Did you use 'add reference' to get the reference? Am wondering how you wound up referencing the 2.0 one in a 4.0 project in the first place.
Brian
Yea, I used "Add Reference" to get this... however, I have the VS PowerTools with the better-designed Add Reference dialog installed, so this might be the problem.
codekaizen
@Brian, scratch that. I must have browsed to it, and just not understood that F# v2.0 can also target the CLRv2, and therefore has two different sets of assemblies.
codekaizen
+3  A: 

You can resolve conflicts by using C# assembly aliases and qualifying source assembly explicitly in C# code: for example if you have Tuple type defined both in F# assembly and in you libraries.

desco
This is cool, and I didn't know about the 'extern alias' in C#, but it also notes that "an alias must be specified on the command line", which appears to be, at best, obscure and impractical in Visual Studio.
codekaizen
VS supports this feature: you can specify alias in properties of assembly reference
desco
@desco - Wow. Cool! Thanks for the great tip. +1.
codekaizen