我重构了一些我要使用的代码(相对新引入的)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并使用它重建应用程序,该应用程序将正常工作并打印结果:确定"你好"
这是由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工作正常.