F# 为什么可以';t I init可变类型是否为null?

F# 为什么可以';t I init可变类型是否为null?,f#,F#,我正在努力: let mutable ncon : NCon = null 并获得: Error 1 The type 'NCon' does not have 'null' as a proper value 其中类型以这种方式声明 type NCon(settings : ISettings) = ... 我计划将它用作静态属性,并在用户完成设置后初始化它,那么我做错了什么?为什么我不能用null初始化可变类型 我必须使用选项吗?因此,要使其变为“无”或“某些”?您必须向您的N

我正在努力:

let mutable ncon : NCon = null
并获得:

Error   1   The type 'NCon' does not have 'null' as a proper value
其中类型以这种方式声明

type NCon(settings : ISettings) = ...
我计划将它用作静态属性,并在用户完成设置后初始化它,那么我做错了什么?为什么我不能用null初始化可变类型

我必须使用选项吗?因此,要使其变为“无”或“某些”?

您必须向您的NCO类型提供如下所示的:

[<AllowNullLiteral>]
type NCon(settings : ISettings) = ...
[]
键入NCon(设置:ISettings)=。。。
这是因为F#阻止您使用Null。。。这主意不错

关于你的其他问题: 是的,我宁愿使用一个选项——而且我也会考虑使用一个REF单元——但是这要看你想用它做什么。

< P>你必须给你的NCON类型提供一个这样的值:

[<AllowNullLiteral>]
type NCon(settings : ISettings) = ...
[]
键入NCon(设置:ISettings)=。。。
这是因为F#阻止您使用Null。。。这主意不错

关于你的其他问题:
是的,我宁愿使用一个选项——我也会考虑使用一个REF单元——但是这取决于你想用它来做什么。< /P>另一个选项是“代码>运算符。未检查。默认值< /COD>”,它给出了给定类型的最佳允许的近似值为空。但是干净的解决方案仍然使用一个选项,甚至是一个懒惰值。
未选中。defaultof
与null不同?(对于默认为null的类型)@GregRos不是-但例如
未选中。defaultof=0
。唯一的区别是对于不可为空的类型(结构等),顺便说一下,您会得到一个
0
valueOh。为了将不带
AllowNullLiteral
属性的类型与null进行比较(例如,如果您从
defaultof
运算符收到值),您必须调用
obj.ReferenceEquals(x,null)
。F#不允许对没有该属性的类型进行
null
比较。您还将遇到一些其他问题。另一个选项是
运算符.Unchecked.Defaultof
,它为给定类型的null提供了允许的最佳近似值True-但是干净的解决方案仍然会使用一个选项,甚至是一个惰性值
Unchecked.Defaultof
与null有何不同?(对于默认为null的类型)@GregRos不是-但例如
未选中。defaultof=0
。唯一的区别是对于不可为空的类型(结构等),顺便说一下,您会得到一个
0
valueOh。为了将不带
AllowNullLiteral
属性的类型与null进行比较(例如,如果您从
defaultof
运算符收到值),您必须调用
obj.ReferenceEquals(x,null)
。F#不允许对没有该属性的类型进行
null
比较。您还将遇到一些其他问题。