F#如何返回值为元组或null

时间:2010-06-06 05:44:33

标签: f#

    let retVal =
      if reader.Read() then
        (reader.GetString(0), getBytesData reader 1, reader.GetDateTime(2))
      else
        null

F#不允许返回null

我如何将值返回为元组或null?

3 个答案:

答案 0 :(得分:11)

F#不允许您返回null。

因为那时部分和其他部分有不同的类型。

您可以使用Option type

let retVal =
  if reader.Read() then
    Some (reader.GetString(0), getBytesData reader 1, reader.GetDateTime(2))
  else
    None

使用retVal时,使用模式匹配:

match retVal with
| Some v -> ...
| None -> // null case

答案 1 :(得分:8)

为了向Yin Zhu的答案添加一些额外的信息,F#语言中null值的情况如下:

  • F#类型,例如元组(例如int * int),这正是你的情况,没有null作为有效值,所以你不能在这里使用null case(其他类型是函数值,例如int -> int,列表和大多数F#库类型)

  • .NET框架中的类型可以具有null值,因此您可以编写:

    let (rnd:Random) = null
    

    这不是惯用的F#风格,但允许使用。

  • 如果您定义自己的F#类型,它将不会自动允许您使用null作为该类型的有效值(它遵循目标以最小化null的使用在F#)。但是,您可以明确允许:

    [<AllowNullLiteral>]
    type MyType = ...
    

答案 2 :(得分:0)

为了进一步澄清,我从 How do you return a null Tuple from f# to c#? 复制了我的答案,该答案已作为此问题的副本关闭:

如果您需要它与 C# 互操作,您可以像这样使用 Unchecked.Defaultof

let retVal =
  if reader.Read() then
    (reader.GetString(0), getBytesData reader 1, reader.GetDateTime(2))
  else
    Unchecked.Defaultof<_>

但是,在 F# 中强烈不鼓励使用空值,如果互操作性不是您的主要关注点,使用选项会更自然:

let retVal =
  if reader.Read() then
    Some (reader.GetString(0), getBytesData reader 1, reader.GetDateTime(2))
  else
    None