Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

Tags:

c#

f#

idictionary

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...

like image 622
Benjol Avatar asked Dec 08 '25 15:12

Benjol


2 Answers

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.)

like image 117
Tomas Petricek Avatar answered Dec 10 '25 03:12

Tomas Petricek


(I have not verified this, but I suspect...)

You are calling dict, which creates an F#-specific implementation of IDictionary that requires FSharp.Core. If instead, you use Dictionary as the concrete implementation, it will work. You can probably even do new Dictionary<_,_>(dict tupleList) and it will be ok, since that will copy the F# structure into a .NET Dictionary.

like image 36
Brian Avatar answered Dec 10 '25 04:12

Brian



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!