如何使用"如果不是null Else"设定值?

时间:2018-03-15 10:23:17

标签: f#

在VB.NET中你可以写这个

Dim mammal as IAnimal = new Mammal
Dim bird as IAnimal = new Bird
' If mammal is not Nothing, animal is mammal, else it's bird
Dim animal IAnimal = If(mammal, bird) ' animal is mammal

Dim mammal as IAnimal
Dim bird as IAnimal = new Bird
' animal is now Bird
Dim animal IAnimal = If(mammal, bird)

在C#中

IAnimal mammal = new Mammal()
IAnimal bird = new Bird()
// If mammal is not null, animal is mammal, else it's bird
IAnimal animal = mammal ?? bird; // animal is mammal

IAnimal mammal;
IAnimal bird = new Bird()
// animal is now bird
IAnimal animal = mammal ?? bird;

但是如何在F#中做到这一点?是否有像VB.NET和C#中的短语法?

我想出了这个作为替代品,直到我发现它是否/如何完成。

let IfNotNullElse (v1, v2) = 
    if v1 <> null then
        v1
    else
        v2

1 个答案:

答案 0 :(得分:5)

在惯用的自包含F#中,您不知道任何时候任何内容都可能为空,因此使用Option类型并提供如下默认值更为常见:

Some 1 |> Option.defaultValue 2  // 1
None   |> Option.defaultValue 2  // 2

但是,如果您正在使用.NET可空引用,那么您可以定义自己的空合并运算符。遗憾的是,??不允许作为运营商名称:

let (|?) a b = if isNull a then b else a

null |? null |? "a"  // "a"
"a" |? null  // "a"
(null:string) |? null  // null

但要注意这里没有懒惰的评价。 |?右侧的表达式总是被完整评估。