F#在继承的构造函数参数列表中分配继承的属性值

时间:2017-07-17 06:12:22

标签: f#

我无法解释此错误(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
     )

提前致谢。

1 个答案:

答案 0 :(得分:4)

看起来参数值中的某些字符会残留解析器并将整个事物解析为比较(即x = y),并且因为它是一个布尔值,它假设它必须是值一个未命名的参数,因此错误。

我在F#规范中找不到任何提及,但到目前为止,我的实验已经发现违规字符列表包括(但不限于)<,{{1} },>$。加号&和花括号+不在列表中。

{ }

幸运的是,有一种解决方法:将整个值括在一对括号中。这有助于解析器正确确定值的位置。