Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# Compile with standalone标志在客户端代码中给出编译错误_F#_Compiler Errors - Fatal编程技术网

F# Compile with standalone标志在客户端代码中给出编译错误

F# Compile with standalone标志在客户端代码中给出编译错误,f#,compiler-errors,F#,Compiler Errors,我正在尝试使用--standalone编译器标志进行编译。项目本身编译得很好,但我有一个单元测试项目,它在Zero29项目中执行一些代码,即使它是一个可执行程序(.exe) 没有--standalone编译标志,一切正常 但是,当我将--standalone编译标志添加到Zero29项目时,Zero29项目可以很好地编译,但是在单元测试项目中,编译器会抱怨这种有区别的联合: 单元测试项目直接引用Zero29项目: Zero29.UnitTests--引用-->Zero29(其中添加了--stan

我正在尝试使用
--standalone
编译器标志进行编译。项目本身编译得很好,但我有一个单元测试项目,它在Zero29项目中执行一些代码,即使它是一个可执行程序(.exe)

没有
--standalone
编译标志,一切正常

但是,当我将
--standalone
编译标志添加到Zero29项目时,Zero29项目可以很好地编译,但是在单元测试项目中,编译器会抱怨这种有区别的联合:

单元测试项目直接引用Zero29项目:

Zero29.UnitTests--引用-->Zero29(其中添加了--standalone)

当我尝试编译整个解决方案时,Zero29项目使用
--standalone
标志进行编译,但是Zero29.UnitTests的编译失败。有几个错误,但它们都是相同的,因此这里有一个示例:

错误FS0039:未定义值或构造函数“Assign”

它指向第三行:

let ParseAssignVersionReturnsCorrectResult(版本:string)=
让实际值=[|“-a”版本|]|>Args.Parse
验证顺序(收费表)@>
奇怪的是,虽然编译器在这段代码片段的第三行抱怨
Assign
,但它却没有抱怨使用了
Args.Parse
,即使它是

为什么会这样,我如何解决这个问题


(我试图在这里找出问题所在,但如果需要更多信息,我提供的链接指向GitHub上的实际代码文件。)

使用
--standalone
开关编译的库无法公开任何F#数据类型。这一点在皮克林(2007)的第。210在你的情况下,一个受歧视的联盟就是这些被禁止的类型之一。文件是可执行文件这一事实在这里没有任何改变:当您试图将其作为库使用时,它就变成了库

也有多个报告(例如,和)指出,即使是使用
--standalone
编译的库也会有行为,引用其中一个源代码“funky”。可以肯定地说,此开关的使用可能仅限于独立的可执行文件(即使在单元测试中,它们也不能假装是库)



Pickering R.(2007)。F#.Apress的基础。

这看起来像是F#编译器(fsc.exe)中的一个bug由于编译Zero29项目时使用和不使用
--standalone
编译器标志时,构建参数完全相同。我不能说我没有想到这个想法,因为我总是犹豫说Select被破坏了……似乎Zero29是使用
--standalone
标志编译的,Args.Assign和好友显示为“嵌套类型”。在编译Zero29时,如果不使用
--standalone
标志,“Assign”将变成“Union case Args.Assign”。编译器似乎忽略了独立案例中的某些内容。下一步可能是查看生成的类型。这里有一些相关的讨论:
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
let ParseAssignVersionReturnsCorrectResult(version : string) =
    let actual = [| "-a"; version |] |> Args.Parse
    verify <@ [Assign(Version version)] = (actual |> Seq.toList) @>