覆盖 ToString 和 `%A` 说明符

Overriding ToString and `%A` specifier

如果覆盖ToString类型

type TestMe ()=
    override __.ToString() = null

然后我通过"%A"说明符输出它

printfn "*%A*" (TestMe())

为什么会抛出 System.NullReferenceException

我原以为它会表现得像

printfn "*%A*" null

简单地打印 <null>,没有任何例外。

你确定吗?

我得到以下输出:

type TestMe ()=
    override __.ToString() = null

TestMe()
//val it : TestMe =

printfn "%A" (TestMe())
//val it : unit = ()

有细微差别,因为我假设反射在 unitnull 之间进行一些转换,但它没有显示异常。为什么需要 "*%A*" 中的星星?

这个问题 got fixed in F# 4.1,现在明确处理 ToString() returns null 的情况。在此修复之前,null 会向上移动并最终被取消引用。

升级您的 FSharp.Core 版本将为您解决问题。

话虽如此,我想指出从 ToString 返回 null 通常是一个很大的禁忌。甚至 MSDN docs 也有关于它的具体警告。