如何在没有F#代码细节的情况下调试TypeLoadException?

时间:2018-08-01 22:05:00

标签: f# typeloadexception

问题是我的类型之一,Expression<'P>无法用TypeLoadException加载。不幸的是,Visual Studio无法显示任何其他信息,包括其InnerException

实际上,我根本无法检查异常对象。当地人不会显示$exception,并且在“监视”窗口中手动输入也无法找到它。堆栈窗口也为空。

我尝试了融合日志,但是该程序集甚至没有显示在此处,例如日志似乎在加载此类型(和程序集)之前立即停止。

我也尝试过创建一个C#项目,并对其进行调试,而不是直接对F#项目进行调试,但是遇到了同样的问题。

我正在通过VS 2017 15.8.0预览版5使用F#4.5预览版,但问题可能并非特定于此(代码使用了4.5的东西)。

我最近做了一个巨大的更改,以通过byref使用自定义指针,这还包括将项目迁移到目标.NET Standard 2.0。对.NET标准F#之前的NuGet包仍然存在依赖性。

FSharp.Core-4.5.2已安装到所有相关项目中,但该依赖项除外。

P.S。如果来自F#Tools团队的人看到此消息,则代码位于https://github.com/Church-of-the-Singularity/GeneticProgramming中,标记为repro/TypeLoadException-Expression

更新 看来是编译器错误。我将失败的示例缩小为以下代码:

[<Struct>] type Ptr<'P, 'T when 'T: struct>(ptr: 'P) = member this.Address = ptr;;
[<Struct>] type MyExpr<'P> = Zero | Reference of reference:Ptr<'P, MyExpr<'P>>;;

如果仅将其粘贴到F#交互式中,则会看到我的异常。在4.1和4.5中都可以复制。已报告to GitHub

1 个答案:

答案 0 :(得分:1)

这似乎是编译器错误。我将失败的示例缩小为以下代码:

[<Struct>] type Ptr<'P, 'T when 'T: struct>(ptr: 'P) = member this.Address = ptr;;
[<Struct>] type MyExpr<'P> = Zero | Reference of reference:Ptr<'P, MyExpr<'P>>;;

如果仅将其粘贴到F#交互式中,则会看到我的异常。在4.1和4.5中都可以复制。已报告to GitHub

解决方法:按照'P定义中的'TPtr的4.1交换顺序:-D