覆盖ToString和`%A`说明符

3 printf f# nullreferenceexception

如果ToString是类型中的覆盖

type TestMe ()=
    override __.ToString() = null
Run Code Online (Sandbox Code Playgroud)

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

printfn "*%A*" (TestMe())
Run Code Online (Sandbox Code Playgroud)

它为什么抛出System.NullReferenceException

我原以为它会表现得像

printfn "*%A*" null
Run Code Online (Sandbox Code Playgroud)

它只是打印<null>而没有任何例外.

Fyo*_*kin 5

这个问题在F#4.1中得到修复,它现在明确地处理了ToString()返回的情况null.在修复之前,null它将向上移动并最终被解除引用.

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

说了这么多,我想指出的是,返回nullToString一个一般的大禁忌.甚至MSDN文档都有一个特定的警告.