使用F#结果区分联合会导致TypeLoadException

Vag*_*lov 10 f#

我重构了一些我要使用的代码(相对新引入的)F#在FSharp.Core中定义的结果类型,如下所示:

type Result<'TOk,'TError> = 
| Ok of 'TOk 
| Error of 'TError
Run Code Online (Sandbox Code Playgroud)

一切都编译但在运行时应用程序失败,出现以下异常:

由于值类型不匹配,无法从程序集"SomeAssembly,Version = 1.25.24.0,Culture = neutral,PublicKeyToken = null"加载类型"Microsoft.FSharp.Core.FSharpResult`2".

如果我将定义复制到我的项目中,使其隐藏原始项目,一切正常.

app.config具有以下部分:

  <dependentAssembly>
    <Paket>True</Paket>
    <assemblyIdentity name="FSharp.Core" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-65535.65535.65535.65535" newVersion="4.4.1.0" />
  </dependentAssembly>
Run Code Online (Sandbox Code Playgroud)

并使用该指令更新项目文件 <TargetFSharpCoreVersion>4.4.1.0</TargetFSharpCoreVersion>

所以我不确定是什么原因导致这个错误.同样奇怪的是,错误消息声称FSharpResult应该驻留在项目程序集中,而不是FSharp.Core.dll.

UPDATE.正如评论中所建议的那样,只有在使用Visual Studio 2015构建应用程序时才会出现问题.这是一个可以重现问题的小型控制台程序:

open System

[<EntryPoint>]
let main argv = 
    let result = Result.Ok "Hello"
    printfn "%A" result
    0
Run Code Online (Sandbox Code Playgroud)

打开Visual Studio 2015,构建并运行项目,您应该看到以下错误:Unhandled Exception:System.TypeLoadException:无法从程序集'ResultTest,Version = 1.0.0.0加载类型'Microsoft.FSharp.Core.FSharpResult`2',由于值类型不匹配,Culture = neutral,PublicKeyToken = null'.在Program.main(String [] argv)

如果您有Visual Studio 2017并使用它重建应用程序,该应用程序将正常工作并打印结果:确定"你好"

Vag*_*lov 9

这是由F#4.0编译器与FSharp.Core 4.4.1.0一起使用引起的,如下所述:

https://github.com/Microsoft/visualfsharp/issues/3354

解决方法:只要使用Visual Studio 2015,就可以将FSharp.Compiler.Tools NuGet包添加到受影响的项目中.Visual Studio 2017工作正常.