Использование Unchecked.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
(возможно, потому, что вам нужно использовать его в некотором коде C #, который в любом случае будет игнорировать ограничение F #), тогда вы можете пометить определение типа, используя специальный атрибут, который позволяет использовать null
с типом.
[<AllowNullLiteral>]
type IParent =
abstract DoStuff : unit -> unit
Тогда вы можете написать let mutable parent:IParent = null
. Преимущество этого подхода заключается в том, что вы также можете легко проверить, является ли значение null
(используя просто if parent <> null then ...
), что не так очевидно при использовании Unchecked.defaultof<_>
.