let retVal =
if reader.Read() then
(reader.GetString(0), getBytesData reader 1, reader.GetDateTime(2))
else
null
F#不允许返回null
我如何将值返回为元组或null?
答案 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