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

mam*_*amu 4 f#

    let retVal =
      if reader.Read() then
        (reader.GetString(0), getBytesData reader 1, reader.GetDateTime(2))
      else
        null
Run Code Online (Sandbox Code Playgroud)

F#不允许返回null

我怎样才能将值返回为元组或null?

Yin*_*Zhu 11

并不是F#不允许您返回null.

这是因为那时部分和其他部分有不同的类型.

您可以使用选项类型.

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

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

match retVal with
| Some v -> ...
| None -> // null case
Run Code Online (Sandbox Code Playgroud)


Tom*_*cek 8

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

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

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

    let (rnd:Random) = null
    
    Run Code Online (Sandbox Code Playgroud)

    这不是惯用的F#风格,但它是允许的.

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

    [<AllowNullLiteral>]
    type MyType = ...
    
    Run Code Online (Sandbox Code Playgroud)