在C#项目中包含FSharp.Core:解决类型冲突

我正在使用C#中的一些F#类型( Matrix等),所以我需要在我的C#项目中引用FSharp.Core程序集。 到现在为止还挺好。

但是,显然在mscorlib.dll(v4)中定义了一些在FSharp.Core(v2)中“重复”的类型,如System.TupleSystem.IObservable 。 我无法理解为什么这是在.Net 4.Matt Ellis明确表示他们将在他的MSDN文章中删除 :

遇到[重复]问题的一种语言是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:\ Program Files中存在类型’System.Tuple’ (x86)\ Reference Assemblies \ Microsoft \ FSharp \ 2.0 \ Runtime \ v2.0 \ FSharp.Core.dll’

显然,解决这个问题的方法是在C#编译器命令行上切换该类型的别名 :

csc.exe MyType.cs /reference:System.Tuple`2=mscorlib.dll /reference:FSharp.Core.dll

但是,我找不到让Visual Studio将此参数发送到C#编译器的方法。

有人有解决方案吗?

您需要引用F#运行时的4.0版本。 此版本对应于mscorlib的4.0版本,并且没有冲突类型。 它们将在此目录中

C:\ Program Files(x86)\ Reference Assemblies \ Microsoft \ FSharp \ 2.0 \ Runtime \ v4.0

您可以通过在C#代码中显式使用C#程序集别名和限定源程序集来解决冲突:例如,如果在F#程序集和库中都定义了Tuple类型。