覆盖 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 = ()
有细微差别,因为我假设反射在 unit
和 null
之间进行一些转换,但它没有显示异常。为什么需要 "*%A*"
中的星星?
这个问题 got fixed in F# 4.1,现在明确处理 ToString()
returns null
的情况。在此修复之前,null
会向上移动并最终被取消引用。
升级您的 FSharp.Core 版本将为您解决问题。
话虽如此,我想指出从 ToString
返回 null
通常是一个很大的禁忌。甚至 MSDN docs 也有关于它的具体警告。
如果覆盖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 = ()
有细微差别,因为我假设反射在 unit
和 null
之间进行一些转换,但它没有显示异常。为什么需要 "*%A*"
中的星星?
这个问题 got fixed in F# 4.1,现在明确处理 ToString()
returns null
的情况。在此修复之前,null
会向上移动并最终被取消引用。
升级您的 FSharp.Core 版本将为您解决问题。
话虽如此,我想指出从 ToString
返回 null
通常是一个很大的禁忌。甚至 MSDN docs 也有关于它的具体警告。