Search code examples
c#f#idictionary

How can I return a Dictionary from F# to C# without having to include FSharp.Core?


I'm trying to return a IDictionary<int,int> (created with dict tuplist) from F# to C#, but it says that I must include a reference to FSharp.Core because of System.Collections.IStructuralEquatable.

I've tried returning a Dictionary<_,_>(dict tuplist), but that doesn't make any difference.

I even tried Dictionary<_,_>(dict tuplist, HashIdentity.Reference), but that says that int is a struct...

UPDATE

OK, ME = STUPID

I just omitted to include in my question the crucial detail: which is that I was returning my dictionary in a F# record and that is the problem. Because I added the record and the Dictionary at the same time, and I saw the IStructuralEquality, I just assumed it was the dictionary which was the problem.

Doh! Sorry...


Solution

  • I think this should work. If you don't expose any F# specific type in the public signature, than you shouldn't need to reference the FSharp.Core.dll assembly in your C# project (you'll still need to distribute it with the F# library, though).

    I tried writing a simple example and I can compile the C# project without referencing FSharp.Core. Could you try if the following project works for you: http://dl.dropbox.com/u/5676796/test.zip ?

    It declares a simple F# module:

    module Module1
    open System.Collections.Generic
    
    let getDictionary() = 
      let d = new Dictionary<_, _>()
      d.[10] <- 1
      d :> IDictionary<int, int>
    

    And the code that references it from C# looks like this:

    var d = Module1.getDictionary();
    Console.WriteLine("d 10 = " + d[10]);
    

    Do you have any other public F# member that would expose some F# specific type (this may include things like F# records & discriminated unions, F# list, etc.)