【发布时间】:2017-12-24 16:30:10
【问题描述】:
我重构了一些代码以使用(相对较新引入的)F# Result 类型,该类型在 FSharp.Core 中定义,如下所示:
type Result<'TOk,'TError> =
| Ok of 'TOk
| Error of 'TError
一切都可以编译,但在运行时应用程序失败并出现以下异常:
无法从 程序集'SomeAssembly,版本=1.25.24.0,文化=中性, 由于值类型不匹配,PublicKeyToken=null'。
如果我将定义复制到我的项目中,使其覆盖原始项目,则一切正常。
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>
项目文件使用指令<TargetFSharpCoreVersion>4.4.1.0</TargetFSharpCoreVersion>更新
所以我不确定是什么导致了这个错误。同样奇怪的是,错误消息声称 FSharpResult 应该驻留在项目程序集中,而不是 FSharp.Core.dll。
更新。正如 cmets 中所建议的,该问题仅在使用 Visual Studio 2015 构建应用程序时出现。这是一个重现该问题的小型控制台程序:
open System
[<EntryPoint>]
let main argv =
let result = Result.Ok "Hello"
printfn "%A" result
0
打开 Visual Studio 2015,构建并运行项目,您应该会看到以下错误: 未处理的异常:System.TypeLoadException:无法加载类型 来自程序集的“Microsoft.FSharp.Core.FSharpResult`2” 'ResultTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' 由于值类型不匹配。 在 Program.main(String[] argv)
如果您有 Visual Studio 2017 并使用它重新构建应用程序,该应用程序将正常工作并打印结果: 好的“你好”
【问题讨论】:
-
我认为你在某处有过时的编译结果。尝试清理所有内容并完全重建。
-
谢谢!会的。
-
不 :-( 没有帮助。清理目录,重建一切,同样的错误。
-
做到了。我没有在任何地方定义 Result,所以无论我在哪里使用它(在几个程序集中),我都看到它指向 Microsoft.FSharp.Core。但是在运行时会抛出 TypeLoadException。
-
是的,我确认问题出在您使用 Visual Studio 2015 构建代码时。
标签: f#