3

我正在尝试从 F# 返回一个IDictionary<int,int>(使用创建的dict tuplist)到 C#,但它说我必须包含对的引用,FSharp.Core因为System.Collections.IStructuralEquatable.

我试过返回 a Dictionary<_,_>(dict tuplist),但这没有任何区别。

我什至尝试过Dictionary<_,_>(dict tuplist, HashIdentity.Reference),但这说那int是一个结构......

更新

好吧,我 = 愚蠢

我只是省略了在我的问题中包含关键细节:这是我在 F# 记录中返回我的字典,就是问题所在。因为我同时添加了记录和字典,并且我看到了 IStructuralEquality,所以我只是假设问题出在字典上。

嗬!对不起...

4

2 回答 2

3

我认为这应该有效。如果您没有在公共签名中公开任何 F# 特定类型,那么您不需要FSharp.Core.dll在 C# 项目中引用程序集(不过,您仍然需要将它与 F# 库一起分发)。

我尝试编写一个简单的示例,我可以编译 C# 项目而无需引用FSharp.Core. 如果以下项目适合您,您能否尝试:http: //dl.dropbox.com/u/5676796/test.zip

它声明了一个简单的 F# 模块:

module Module1
open System.Collections.Generic

let getDictionary() = 
  let d = new Dictionary<_, _>()
  d.[10] <- 1
  d :> IDictionary<int, int>

从 C# 引用它的代码如下所示:

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

您是否有任何其他公开 F# 成员会公开某些 F# 特定类型(这可能包括 F# 记录和区分联合、F# 列表等)

于 2010-04-14T13:42:27.733 回答
2

(我还没有验证这一点,但我怀疑......)

您正在调用dict,它创建了一个IDictionary需要 FSharp.Core 的特定于 F# 的实现。相反,如果您将Dictionary其用作具体实现,它将起作用。您甚至可以这样做new Dictionary<_,_>(dict tupleList)并且没问题,因为这会将 F# 结构复制到 .NET 字典中。

于 2010-04-14T15:13:49.020 回答