F#可变,没有MEF的初始值
我有一堆模块导出IModule接口。所以在主程序中我没有问题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 [] 成员十.模块
...
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