C#默认关键字在F#中的等效项是什么?


78

我正在寻找等效的C#default关键字,例如:

public T GetNext()
{
    T temp = default(T);
            ...

谢谢

Answers:



34

从技术上讲,F#函数与C#中Unchecked.defaultof<'a>default运算符等效。但是,我认为值得注意的是,在F#defaultof中将其视为不安全的事情,仅应在确实必要时才使用(就像使用nullF一样不鼓励使用)。

在大多数情况下,可以defaultof通过使用option<'a>类型来避免需要。它允许您表示一个值尚不可用的事实。

但是,这是一个简短的示例来演示此想法。以下C#代码:

    T temp = default(T);
    // Code that may call: temp = foo()
    if (temp == default(T)) temp = bar(arg)
    return temp;

可能会这样写在F#中(使用命令式功能):

    let temp = ref None
    // Code that may call: temp := Some(foo())
    match !temp with 
    | None -> bar(arg)
    | Some(temp) -> temp

当然,这取决于您的特定情况,在某些情况下,这defaultof是您唯一可以做的。但是,我只想指出defaultof在F#中使用频率较低。


1
在您的C#示例中,在if语句中使用赋值运算符而不是相等运算符。那是故意的吗?
doppelgreener

我应该说这对我不起作用,让t = ref None t:= Some(context.Items.FirstOrDefault(fun ii-> ii.Name = i.Name))与| t匹配!一些它->-即使在这里为空也已完成| 无->忽略
Martin Bodocky 2015年

@MartinBodocky您的代码将始终返回Some(_)。它要么返回,Some(value)要么Some(defaultof<>)两者都将匹配Some _您的match表达式中的大小写。您可以使用context.Items |> Seq.tryFind(fun II -> ii.Name = i.Name)匹配表达式即可按预期工作
Rune FS
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.