【发布时间】:2011-01-15 19:34:18
【问题描述】:
我正在寻找相当于 C# default 关键字,例如:
public T GetNext()
{
T temp = default(T);
...
谢谢
【问题讨论】:
标签: c# f# default keyword c#-to-f#
我正在寻找相当于 C# default 关键字,例如:
public T GetNext()
{
T temp = default(T);
...
谢谢
【问题讨论】:
标签: c# f# default keyword c#-to-f#
我在博客中找到了这个:“What does this C# code look like in F#? (part one: expressions and statements)”
C# 有一个名为“default”的运算符 返回零初始化 给定类型的值:
default(int)它的效用有限;最常见的你可以使用 泛型中的默认(T)。 F# 有一个 与图书馆相似的结构 功能:
Unchecked.defaultof<int>
【讨论】:
从技术上讲,F# 函数 Unchecked.defaultof<'a> 等效于 C# 中的 default 运算符。但是,我认为值得注意的是,defaultof 在 F# 中被认为是 不安全 的东西,应该只在真正需要时才使用(就像使用 null,在F#)。
在大多数情况下,您可以通过使用 option<'a> 类型来避免使用 defaultof。它允许您表示一个值尚不可用的事实。
但是,这里有一个简短的例子来展示这个想法。以下 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# 中的使用频率较低。
【讨论】:
Some(_)。它返回 Some(value) 或 Some(defaultof<>) 两者都将匹配匹配表达式中的 Some _ 大小写。您可以使用context.Items |> Seq.tryFind(fun II -> ii.Name = i.Name),然后匹配表达式将按您的预期工作