开发者

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

开发者 https://www.devze.com 2022-12-27 09:02 出处:网络
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.IStructuralEqua开

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.IStructuralEqua开发者_JS百科table.

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


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


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

0

精彩评论

暂无评论...
验证码 换一张
取 消