【发布时间】:2015-02-05 15:36:08
【问题描述】:
我正在尝试使用 --standalone 编译器标志编译 Zero29。该项目本身编译良好,但我有一个单元测试项目,它在 Zero29 项目中执行一些代码,即使它是一个可执行程序 (.exe)。
一切正常没有--standalone 编译标志。
但是,当我将--standalone 编译标志添加到Zero29 项目时,Zero29 项目编译正常,但在单元测试项目中,编译器抱怨这个歧视联合defined in the Zero29 project:
namespace Ploeh.ZeroToNine
open System
open Ploeh.ZeroToNine.Versioning
type Arg =
| Assign of Version
| AssignRank of Rank * int
| Increment of Rank
| ListVersions
| ShowHelp
| Unknown of string list
单元测试项目直接引用Zero29项目:
Zero29.UnitTests --references--> Zero29(添加了--standalone的地方)
当我尝试编译整个解决方案时,Zero29 项目使用 --standalone 标志编译,但 Zero29.UnitTests 的编译失败。有几个错误,但它们都是一样的,所以这里有一个例子:
错误 FS0039:未定义值或构造函数“Assign”
指向this code的第三行:
let ParseAssignVersionReturnsCorrectResult(version : string) =
let actual = [| "-a"; version |] |> Args.Parse
verify <@ [Assign(Version version)] = (actual |> Seq.toList) @>
奇怪的是,虽然编译器在这段代码 sn-p 的第三行抱怨 Assign,但它并没有抱怨使用了 Args.Parse,即使它是defined in the same code file as the Arg Discriminated Union.
为什么会这样,我该如何解决这个问题?
(我试图在这里提炼问题,但如果需要更多信息,我提供的链接指向 GitHub 上的实际代码文件。)
【问题讨论】:
-
这看起来像是 F# 编译器 (fsc.exe) 中的一个错误,因为在使用和不使用
--standalone编译器标志编译 Zero29 项目时,构建参数完全相同。 -
我不能说我没有想到这个想法,因为我总是犹豫要说 Select is Broken...
-
似乎在 Zero29 使用
--standalone标志编译的情况下,Args.Assign 和朋友显示为“嵌套类型”。当 Zero29 在没有--standalone标志的情况下编译时,“Assign”变成了“Union case Args.Assign”。在独立的情况下,编译器似乎省略了一些东西。下一步可能是查看生成的类型。一些相关的讨论似乎在这里:stackoverflow.com/questions/17832203/…
标签: f# compiler-errors