在C#项目中包含FSharp.Core:解决类型冲突
我正在使用C#中的一些F#类型( Matrix等),所以我需要在我的C#项目中引用FSharp.Core程序集。 到现在为止还挺好。
但是,显然在mscorlib.dll(v4)中定义了一些在FSharp.Core(v2)中“重复”的类型,如System.Tuple
和System.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类型。