Linux下使用Mono时F#的ToString() %A格式化功能失效问题
问题原因
F# 的 printf "%A" 采用结构化打印逻辑,设计上默认不会优先调用自定义类型重写的 ToString() 方法,这个是语言标准行为,和 Mono 环境、.NET Framework 组件缺失没有任何关系,你在在线环境和本地运行结果一致也验证了这一点。
解决方案
- 方案1:替换格式化符为
%O%O格式化符的逻辑就是直接调用对象的ToString()方法,你重写方法后直接用printf "%O" 实例对象即可输出自定义内容。 - 方案2:给自定义类型添加
StructuredFormatDisplay特性
如果需要保留%A的使用习惯,可以给自定义类型加特性指定结构化打印的输出内容,示例代码如下:
// 特性参数中的占位符会调用对应属性/方法的返回值 [<StructuredFormatDisplay("{ToString()}")>] type CustomType (id: int) = override _.ToString() = $"自定义类型ID:{id}"
上述类型定义后,用 printf "%A" 打印时就会输出你自定义的ToString内容。
- 方案3:如果是F#专属的记录、可区分联合类型,也可以直接在特性中拼接固定内容和属性值,不需要单独重写ToString也能实现自定义
%A输出。
内容的提问来源于stack exchange,提问作者choltreppe
相关产品推荐
相关产品推荐

