【问题标题】:Using F# Result discriminated union results in TypeLoadException使用 F# Result 区分联合导致 TypeLoadException
【发布时间】: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>

项目文件使用指令&lt;TargetFSharpCoreVersion&gt;4.4.1.0&lt;/TargetFSharpCoreVersion&gt;更新

所以我不确定是什么导致了这个错误。同样奇怪的是,错误消息声称 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#


【解决方案1】:

在我的例子中,使用 VS2015 IDE 是必须的,所以我们实现了我们自己版本的 Result 类型:

type Result<'t, 'e> = | Ok of 't | Error of 'e

或者您甚至可以根据自己的错误处理要求微调类型,例如:

type Result<'t> =
        | Success of 't
        | Failure of (string * exn option) 

type Result<'t> =
        | Success of 't
        | Failure of (ErrorCode * string)
and ErrorCode = | Code1 | Code2 | Code3

我知道这并不理想,如果您在 F# 核心中提供这种类型会更好,但它确实成功了 :)

【讨论】:

  • 我们也这样做了。
【解决方案2】:

这是由 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 运行良好。

【讨论】:

  • 如果我能 +100000 这个我会的。谢谢。
猜你喜欢
  • 2016-07-14
  • 2011-11-19
  • 1970-01-01
  • 2014-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-27
  • 2014-09-15
相关资源
最近更新 更多