F#可变,没有MEF的初始值

F#可变,没有MEF的初始值,f#,mef,F#,Mef,我有一堆模块导出IModule接口。所以在主程序中我没有问题 ... let mutable modules = Seq.empty [<ImportMany>] member x.Modules with get():IEnumerable<Lazy<IModule, IModuleData>> = modules and set(a) = modules <- a ... 。。。 设可变模块=Seq.empty [] 成员十.模块

我有一堆模块导出IModule接口。所以在主程序中我没有问题

...
let mutable modules = Seq.empty
[<ImportMany>]
member x.Modules
    with get():IEnumerable<Lazy<IModule, IModuleData>> = modules
    and set(a) = modules <- a
...
。。。
设可变模块=Seq.empty
[]
成员十.模块
使用get():IEnumerable=模块
并设置(a)=模块
let mutable parent=Unchecked.defaultof
应该这样做。

让可变父项=Unchecked.defaultof

应该这样做。

使用未选中的
。defaultof
应该这样做,但这意味着你绕过了F类型系统,这可能是一件危险的事情-系统试图防止你意外地取消引用
null
值(并获得
NullReferenceException

在F#中声明的类型没有将
null
作为正确的值,这是为了消除由
null
引起的常见错误。干净的F#方法是使用选项类型来表示缺少值的事实:

let mutable parent:option<IParent> = None

[<Import>] 
member x.Parent 
   with get():IParent = 
      match parent with
      | Some p -> p
      | None -> failwith "TODO: Throw some reasonable exception here!"
   and set(a) = parent <- Some(a)

然后您可以编写
让可变父对象:IParent=null
。这种方法的好处是,您还可以轻松检查值是否为
null
(仅使用
如果父项为null,则使用…
),这在使用
未选中时并不明显。使用
未选中时,默认值应为。默认值应起作用,但这意味着您绕过了F类型系统,这可能是一件危险的事情-系统试图防止您意外地取消引用
null
值(以及获取
NullReferenceException

在F#中声明的类型没有将
null
作为正确的值,这是为了消除由
null
引起的常见错误。干净的F#方法是使用选项类型来表示缺少值的事实:

let mutable parent:option<IParent> = None

[<Import>] 
member x.Parent 
   with get():IParent = 
      match parent with
      | Some p -> p
      | None -> failwith "TODO: Throw some reasonable exception here!"
   and set(a) = parent <- Some(a)

然后您可以编写
让可变父对象:IParent=null
。这种方法的好处是,您还可以轻松地检查值是否为
null
(如果父项为null,则只使用
,然后…
),这在您未选中
时并不明显。默认值是

根据Tomas的解释,您可能应该将导入直接放入构造函数中。这将使您的代码更为惯用。

根据Tomas的解释,您可能应该将导入直接放入构造函数中。这将使您的代码更加惯用。

使用
null
:让可变父对象:IParent=null?我得到一个“类型'IParent'没有'null'作为正确值”错误
null
=
未选中。defaultof
谢谢。这应该作为答案公布。让可变父项=Unchecked.defaultof。不确定它是否能完全工作,但它可以编译。使用
null
:let mutable parent:IParent=null如何?我得到一个“类型'IParent'没有'null'作为正确值”错误
null
=
未选中。defaultof
谢谢。这应该作为答案公布。让可变父项=Unchecked.defaultof。不确定它是否能完全工作,但它可以编译。
let mutable parent:option<IParent> = None

[<Import>] 
member x.Parent 
   with get():IParent = 
      match parent with
      | Some p -> p
      | None -> failwith "TODO: Throw some reasonable exception here!"
   and set(a) = parent <- Some(a)
[<AllowNullLiteral>]
type IParent = 
  abstract DoStuff : unit -> unit