F#这个表达式应该有'unit'类型,但是'bool'类型

fah*_*ash 3 f# unit-type

我有以下代码

if somecondition then
  myobj.Property1 = match myobj.Property1 with
                       | null -> SomePropertyType ()
                       | p -> p
Run Code Online (Sandbox Code Playgroud)

我想要做的是查看myobj.Property1是否为null,如果不是,则单独留下它,否则创建SomePropertyType类型的新对象并分配它.

问题是,我得到了

This expression should have type 'unit', but has type 'bool'
Run Code Online (Sandbox Code Playgroud)

我应该怎么做如果我不得不把那些myobj.Property1 ....的多个声明放在那下面if

Gus*_*Gus 10

您正在比较两个值(使用=),因此返回类型将是bool,但如果您没有其他编译器期望unit的返回类型.

我猜你打算将值赋给属性,<-改为使用:

if somecondition then
    myobj.Property1 <- match myobj.Property1 with ...
Run Code Online (Sandbox Code Playgroud)

无论如何,如果你想检查null分配一个你不需要的默认值match,if then就足够了:

if somecondition then
    if (myobj.Property1 = null) then myobj.Property1 <- SomePropertyType ()
    ...
Run Code Online (Sandbox Code Playgroud)

UPDATE

你可以"合并"两if.. then到一个单一的match:

match (somecondition, myobj.Property1) with
| true, null -> myobj.Property1 <- SomePropertyType ()
...
Run Code Online (Sandbox Code Playgroud)

  • @fahadash如果然后更改单个匹配将不会使其更具功能性.在纯函数式语言中,如果那么其他也是一个函数.如果那么将MANY改为SINGLE匹配是另一个故事.查看更新. (4认同)