我正在使用C#中的一些F#类型(Matrix等),所以我需要在我的C#项目中引用FSharp.Core程序集。到目前为止,非常好。
但是,显然mscorlib.dll(v4)中定义了一些在FSharp.Core(v2)中“重复”的类型,如System.Tuple
和System.IObservable
。我无法理解为什么会出现在.Net 4中。Matt Ellis specifically said they would be removed in his MSDN article:
一种语言遭遇[重复]问题是F#,之前在FSharp.Core.dll中定义了自己的元组类型,但现在将使用Microsoft .NET Framework 4中添加的元组。
如果我可以指定我想在C#程序中使用哪一个,我已经准备好了解这个特别不合时宜的复制。例如,当我尝试使用System.Tuple
类型时,我得到以下C#编译器错误:
错误2'c:\ Program Files(x86)\ Reference Assemblies \ Microsoft \ Framework.NETFramework \ v4.0 \ Profile \ Client \ mscorlib.dll'和'c:'中存在'System.Tuple'类型\ Program Files(x86)\ Reference Assemblies \ Microsoft \ FSharp \ 2.0 \ Runtime \ v2.0 \ FSharp.Core.dll'
显然,这方面的问题是a switch on the C# compiler command line which aliases the type:
csc.exe MyType.cs /reference:System.Tuple`2=mscorlib.dll /reference:FSharp.Core.dll
但是,我找不到让Visual Studio将此参数发送到C#编译器的方法。
任何人都有解决方案吗?
答案 0 :(得分:12)
您需要引用F#运行时的4.0版本。此版本对应于mscorlib的4.0版本,并且没有冲突类型。它们将在此目录中
C:\ Program Files(x86)\ Reference Assemblies \ Microsoft \ FSharp \ 2.0 \ Runtime \ v4.0
答案 1 :(得分:3)
您可以使用C# assembly aliases并在C#代码中显式限定源程序集来解决冲突:例如,如果您在F#程序集和库中都定义了Tuple类型。