代码之家  ›  专栏  ›  技术社区  ›  Benjol

如何才能将字典从f返回到c,而不必包含fsharp.core?

  •  3
  • Benjol  · 技术社区  · 14 年前

    我正试图返回一个 IDictionary<int,int> (创建于 dict tuplist )从f到c,但上面说我必须包括 FSharp.Core 因为 System.Collections.IStructuralEquatable .

    我试着把一个 Dictionary<_,_>(dict tuplist) ,但这没什么区别。

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

    更新

    好吧,我=愚蠢

    我只是忘了在我的问题中包括关键的细节:那就是我把字典放在一个f记录里,然后 那个 是个问题。因为我同时添加了记录和字典,而且我看到了它的结构质量,所以我就认为是字典出了问题。

    呸!对不起的。。。

    2 回复  |  直到 14 年前
        1
  •  3
  •   Tomas Petricek    14 年前

    我认为这应该管用。如果在公共签名中不公开任何特定于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列表等内容)

        2
  •  2
  •   Brian    14 年前

    (我没有证实,但我怀疑……)

    你在打电话 dict ,它创建一个特定于f的 IDictionary 这需要fsharp.core。如果相反,你用 Dictionary 作为具体的实施,它将起作用。你甚至可以 new Dictionary<_,_>(dict tupleList) 这样就可以了,因为这样可以将f结构复制到.net字典中。