Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# 重写ToString和“%A”说明符_F#_Printf_Nullreferenceexception - Fatal编程技术网

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
(在依赖项中)足以解决这个问题。我已经更新了答案。