我无法解释此错误(VS 2017中的F#4.1)。
公共代码:
open Eto.Forms
type MyCommand() as this =
inherit Eto.Forms.Command()
do
this.MenuText <- "C&lick Me, Command"
this.ToolBarText <- "Click Me"
this.ToolTip <- "This shows a dialog for no reason"
this.Shortcut <- Application.Instance.CommonModifier ||| Keys.M
F#编辑不接受以下声明;菜单初始化中检测到的错误消息是&#34;命名参数必须出现在所有其他参数之后&#34;:
type MyForm1() =
inherit Eto.Forms.Form(
Title = "Eto Tests"
, ClientSize = Eto.Drawing.Size(600, 400)
, Menu = seq {yield new MyCommand()} |> Seq.fold (fun (mb:MenuBar) c -> mb.Items.Add(c) |> ignore; mb) (new MenuBar())
)
以下声明可以正常运行:
type MyForm1() =
inherit Eto.Forms.Form(
Title = "Eto Tests"
, ClientSize = Eto.Drawing.Size(600, 400)
, Menu = let m = seq {yield new MyCommand()} |> Seq.fold (fun (mb:MenuBar) c -> mb.Items.Add(c) |> ignore; mb) (new MenuBar()) in m
)
提前致谢。
答案 0 :(得分:4)
看起来参数值中的某些字符会残留解析器并将整个事物解析为比较(即x = y
),并且因为它是一个布尔值,它假设它必须是值一个未命名的参数,因此错误。
我在F#规范中找不到任何提及,但到目前为止,我的实验已经发现违规字符列表包括(但不限于)<
,{{1} },>
和$
。加号&
和花括号+
不在列表中。
{ }
幸运的是,有一种解决方法:将整个值括在一对括号中。这有助于解析器正确确定值的位置。