为什么这里的盒子?

Why the box here?

在浏览 Whosebug 时,我偶然发现了以下答案:

// ... removed unneeded code
/// This type is intended for private use within Singleton only.
type private SyncRoot = class end

type Singleton =
    [<DefaultValue>]
    static val mutable private instance: Singleton

    private new() = { }

    static member Instance = 
        lock typeof<SyncRoot> (fun() ->
            // vvv
            if box Singleton.instance = null then
            // ^^^
                Singleton.instance <- Singleton())
        Singleton.instance  

有人可以详细说明为什么需要这里的 box 吗?

给定的 Singleton 类型没有 null 作为正确的值。换句话说,它不可为空,通常不应具有值 null。因此,将类型 Singleton 的值与 null 进行比较是不明智的,即使通过 [<DefaultValue>] 使用未初始化的变量可能会创建此类型的空值变量。装箱将任何东西变成 obj,它可以为 null,因此在此上下文中有效。

使用 Unchecked.defaultof<Singleton> 而不是 null 将使装箱变得不必要并编译。 (还有[<AllowNullLiteral>]属性,可以加在Singleton类型上,指定该类型的实例可以是null。)