我在类上应用DebuggerDisplay属性时遇到问题:

[DebuggerDisplay("--foo--")]
class Foo
{
}

[DebuggerDisplay("Bar: {t}")]
class Bar<T>
{
    public T t;
}

检查类型为Bar<Foo>的对象时,我希望它显示为Bar: --foo--,但是我得到了Bar: {Foo}
我究竟做错了什么?

最佳答案

DebuggerDisplay属性不是递归的。字符串中的{}本质上说对这个表达式求值并内联显示结果。计算内部结果的字符串时,就好像在播放类型或成员的DebuggerDisplay属性一样。这就是为什么您看到{Foo}而不是--foo--的原因。

其原因是可靠性。具有相互递归的DebuggerDisplay属性标记太容易了。在计算内部表达式时,这将导致堆栈溢出或无限循环。不递归地评估DebuggerDisplay属性可防止这种无限递归(尽管用户仍然有可能在特定表达式中自己创建它)。

可以控制内部表达式的显示方式的一种方法是重写.ToString()方法。当计算内部表达式的显示字符串时,将对此进行评估。

关于c# - 通用类上的DebuggerDisplay,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/258917/

10-09 12:39