F# 重写ToString和“%A”说明符
如果类型中的重写F# 重写ToString和“%A”说明符,f#,printf,nullreferenceexception,F#,Printf,Nullreferenceexception,如果类型中的重写ToString type TestMe ()= override __.ToString() = null 然后我通过“%A”说明符输出它 printfn "*%A*" (TestMe()) 为什么它抛出一个System.NullReferenceException 我本以为它会表现得像 printfn "*%A*" null 它只打印,没有任何例外。你确定吗 我得到以下输出: type TestMe ()= override __.ToString()
ToString
type TestMe ()=
override __.ToString() = null
然后我通过“%A”
说明符输出它
printfn "*%A*" (TestMe())
为什么它抛出一个System.NullReferenceException
我本以为它会表现得像
printfn "*%A*" null
它只打印
,没有任何例外。你确定吗
我得到以下输出:
type TestMe ()=
override __.ToString() = null
TestMe()
//val it : TestMe =
printfn "%A" (TestMe())
//val it : unit = ()
有一点不同,因为我假设反射在unit
和null
之间进行一些转换,但它没有显示异常。为什么在“*%A*”
中需要星号?这个问题现在明确地处理了ToString()
返回null
的情况。在此修复之前,null
将沿着堆栈向上移动,并最终被取消引用
升级FSharp.Core版本将为您解决此问题
话虽如此,我想指出,从
到字符串返回null
通常是一个很大的禁忌。甚至对此有一个特别的警告。您只是有一个较新版本的F#。%A
周围的星星是区分输出空字符串和不输出任何内容的常用方法。@FyodorSoikin,啊,谢谢,*技巧很好。我怀疑可能是旧版本,但太懒了,无法启动VS2015。这确实在F#4.1中。你是说在F#4.1中得到了修复?因为我在VS2015中用net462实现了F#4.0。当然,这只是mcve,实际代码是,我在测试一个角落案例:printfn*%a*“(TrimNonEmptyString(null))
。稍后我将更新到VS2017,但我认为它会解决问题,谢谢。出于好奇,安装包FSharp.Core
成功了!从控制台上,我可以看到“已成功安装FSharp.Core 4.2.1
”。另外,以前的版本FSharp.Core.4.1.17
(在依赖项中)足以解决这个问题。我已经更新了答案。