增强了可区分联合的调试信息
Enhanced debug information for discriminated unions
据我所知,DebuggerDisplayAttribute
不能应用于受歧视联盟的各个级别,只能应用于顶级 class。
相应的documentation建议覆盖ToString()
方法是另一种方法。
以下面的例子为例:
type Target =
| Output of int
| Bot of int
override this.ToString () =
match this with
| Output idx -> $"output #{idx}"
| Bot idx -> $"bot #{idx}"
[<EntryPoint>]
let main _ =
let test = Bot 15
0
当从 main
中断 return 并在 test
上放置监视时,VS2019 调试器显示 Bot 15
而不是 bot #15
。
文档还建议:
Whether the debugger evaluates this implicit ToString() call depends
on a user setting in the Tools / Options / Debugging dialog box.
我不知道它指的是什么用户设置。
这在 VS2019 中不可用还是我只是错过了重点?
这里的主要问题是 F# 编译器默默地发出一个 DebuggerDisplay
属性来覆盖您正在查看的文档中描述的默认行为。因此单独覆盖 ToString
不会改变调试器在调试 F# 程序时显示的内容。
F# 使用这个属性来实现它自己的纯文本格式。您可以通过使用 StructuredFormatDisplay
来调用 ToString
来控制此格式:
[<StructuredFormatDisplay("{DisplayString}")>]
type Target =
| Output of int
| Bot of int
override this.ToString () =
match this with
| Output idx -> $"output #{idx}"
| Bot idx -> $"bot #{idx}"
member this.DisplayString = this.ToString()
如果您这样做,Visual Studio 调试器将根据您的需要显示 "bot #15"
。
另一种选择是在顶层明确使用 DebuggerDisplay
你自己,正如你提到的:
[<System.Diagnostics.DebuggerDisplay("{ToString()}")>]
type Target =
| Output of int
| Bot of int
override this.ToString () =
match this with
| Output idx -> $"output #{idx}"
| Bot idx -> $"bot #{idx}"
FWIW,我认为您关于工具/选项/调试设置问题的直接答案是“在变量 windows 中显示对象的原始结构”。但是,此设置与您要解决的问题并不真正相关。
据我所知,DebuggerDisplayAttribute
不能应用于受歧视联盟的各个级别,只能应用于顶级 class。
相应的documentation建议覆盖ToString()
方法是另一种方法。
以下面的例子为例:
type Target =
| Output of int
| Bot of int
override this.ToString () =
match this with
| Output idx -> $"output #{idx}"
| Bot idx -> $"bot #{idx}"
[<EntryPoint>]
let main _ =
let test = Bot 15
0
当从 main
中断 return 并在 test
上放置监视时,VS2019 调试器显示 Bot 15
而不是 bot #15
。
文档还建议:
Whether the debugger evaluates this implicit ToString() call depends on a user setting in the Tools / Options / Debugging dialog box.
我不知道它指的是什么用户设置。
这在 VS2019 中不可用还是我只是错过了重点?
这里的主要问题是 F# 编译器默默地发出一个 DebuggerDisplay
属性来覆盖您正在查看的文档中描述的默认行为。因此单独覆盖 ToString
不会改变调试器在调试 F# 程序时显示的内容。
F# 使用这个属性来实现它自己的纯文本格式。您可以通过使用 StructuredFormatDisplay
来调用 ToString
来控制此格式:
[<StructuredFormatDisplay("{DisplayString}")>]
type Target =
| Output of int
| Bot of int
override this.ToString () =
match this with
| Output idx -> $"output #{idx}"
| Bot idx -> $"bot #{idx}"
member this.DisplayString = this.ToString()
如果您这样做,Visual Studio 调试器将根据您的需要显示 "bot #15"
。
另一种选择是在顶层明确使用 DebuggerDisplay
你自己,正如你提到的:
[<System.Diagnostics.DebuggerDisplay("{ToString()}")>]
type Target =
| Output of int
| Bot of int
override this.ToString () =
match this with
| Output idx -> $"output #{idx}"
| Bot idx -> $"bot #{idx}"
FWIW,我认为您关于工具/选项/调试设置问题的直接答案是“在变量 windows 中显示对象的原始结构”。但是,此设置与您要解决的问题并不真正相关。