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.
精彩评论