Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在不包含FSharp.Core的情况下将字典从F#返回到C#?_C#_F#_Idictionary - Fatal编程技术网

如何在不包含FSharp.Core的情况下将字典从F#返回到C#?

如何在不包含FSharp.Core的情况下将字典从F#返回到C#?,c#,f#,idictionary,C#,F#,Idictionary,我试图将IDictionary(使用dict tuplist创建)从F#返回到C#,但它说我必须包含对FSharp.Core的引用,因为System.Collections.IsStructuralEquatable 我试着返回一个字典(dict tuplist),但这没有任何区别 我甚至尝试了字典(dict tuplist,HashIdentity.Reference),但上面说int是一个结构 更新 好吧,我=愚蠢 我只是没有在我的问题中包括一个关键的细节:那就是我在F#record中返回我

我试图将
IDictionary
(使用
dict tuplist
创建)从F#返回到C#,但它说我必须包含对
FSharp.Core
的引用,因为
System.Collections.IsStructuralEquatable

我试着返回一个
字典(dict tuplist)
,但这没有任何区别

我甚至尝试了
字典(dict tuplist,HashIdentity.Reference)
,但上面说
int
是一个结构

更新

好吧,我=愚蠢

我只是没有在我的问题中包括一个关键的细节:那就是我在F#record中返回我的字典,而这就是问题所在。因为我同时添加了记录和字典,并且看到了IStructuralEquality,所以我认为问题出在字典上


啊!对不起…

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

我试着写了一个简单的例子,我可以在不引用
FSharp.Core
的情况下编译C#项目。如果以下项目适合您,您是否可以尝试一下: ?

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

您是否有任何其他公开的F成员会公开某些F#特定类型(这可能包括F#records&discriminated unions、F#list等)

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


您正在调用
dict
,这将创建需要FSharp.Core的
IDictionary
的特定于F的实现。相反,如果您使用
字典
作为具体实现,它将起作用。你甚至可以做
newdictionary(dict tupleList)
,这样就可以了,因为这样可以将F#结构复制到.NET字典中。

即使你使用
dict
函数,它也可以工作。如果我编写
let getDictionary()=dict[10,1]
,它编译得很好,没有在C#项目中引用FSharp.Core.dll。
getDictionary
函数的公共签名不包含任何F#特定的…啊,嗯。OP问题中提到的IsStructuralEquatable让我想知道.NET 2.0和.NET 4.0上的行为是否不同…我在.NET 2.0上测试了它(仍然使用某种RC版本)。我现在没有安装.NET4.0来尝试它。。。(但如果图书馆的公共签名没有显示任何F#特定类型,如果需要参考,我会非常惊讶)谢谢你的回答,请参阅我的更新问题,抱歉浪费了时间。。。但正是从您的示例项目转变为我的示例项目,帮助我解决了问题所在。顺便说一下,我刚刚完成了RWFP。我很难用语言来表达它有多好。谢谢。@Benjol:非常感谢你对这本书说的客气话!嘿。。。好吧,很高兴你弄明白了:)我想也许你可以把[]属性记录下来,然后它可能会工作。哦,是的,酷。我刚切换到一个具有属性的类,现在我可以切换回来了。谢谢。在你知道答案之前,总是很难知道哪个细节是至关重要的:-)
module Module1
open System.Collections.Generic

let getDictionary() = 
  let d = new Dictionary<_, _>()
  d.[10] <- 1
  d :> IDictionary<int, int>
var d = Module1.getDictionary();
Console.WriteLine("d 10 = " + d[10]);