你在哪里会出错的是:您正在调用Value
属性,该属性可能为空。
当你调用Value
你实际上是说“没关系,我已经严格地改变了这个值,它是绝对不是空所以它是绝对安全的对待它,仿佛它是一个非空的值。”当然,在这种情况下,不符合该条件,因此运行时异常。
在F#中,您不希望与Nullable<'T>
类型一起工作,您希望使用Option<'T>
,这样更安全,编译器可以更有效地检查您是否犯了错误。
您可以从Nullable<'T>
转换为Option<'T>
使用
[for row in data.Rows -> Option.ofNullable (row.A), Option.ofNullable(row.B)]
当然,你必须决定要如何处理None
箱子但它是很容易做的,一旦你所做的列表中设计明确地告诉你,你有一个可能或可能不是某种东西的价值。
我不知道你想要什么样的行为,但作为一个例子,也许你只想绘制两个值都有效的情况?
你可以压缩两个可选值:
module Option =
let zip a b =
match (a,b) with
|Some sa, Some sb -> Some(sa, sb)
|_ -> None
然后,您可以映射回plotable号码,使用List.choose
提取None
箱子。
[for row in data.Rows -> Option.ofNullable (row.A), Option.ofNullable (row.B)]
|> List.choose (fun (a,b) -> Option.zip a b)
|> Chart.Point