覆盖ToString和`%A`说明符

时间:2017-07-22 23:03:37

标签: f# printf nullreferenceexception

如果在类型

中覆盖ToString
type TestMe ()=
    override __.ToString() = null

然后我通过"%A"说明符

输出它
printfn "*%A*" (TestMe())

为什么抛出System.NullReferenceException

我原以为它的行为就像

printfn "*%A*" null

只打印<null>,没有任何例外。

2 个答案:

答案 0 :(得分:5)

此问题got fixed in F# 4.1,现在明确处理ToString()返回null的情况。在此修复之前,null将向上移动并最终被解除引用。

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

话虽如此,我想指出从null返回ToString通常是一个很大的禁忌。即使MSDN docs也有一个特定的警告。

答案 1 :(得分:1)

你确定吗?

我得到以下输出:

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

TestMe()
//val it : TestMe =

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

由于我假设反射在unitnull之间进行了一些转换,但是它没有显示异常。为什么你需要"*%A*"中的星星?