泛型类上的DebuggerDisplay

14

我在一个泛型类上应用DebuggerDisplay属性时遇到了问题:

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

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

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

20

DebuggerDisplay属性不会递归。字符串内的 {} 表示计算并在行内显示结果。对于内部结果的字符串计算,好像没有针对类型或成员使用DebuggerDisplay属性一样。这就是为什么您看到了{Foo}而不是--foo--的原因。

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

您可以通过重写.ToString()方法来控制内部表达式的显示方式。在计算内部表达式的显示字符串时,该方法将被评估。


谢谢!所以这与通用性无关,我猜。 我会选择ToString解决方案。 - Bjarke Ebert

5

1
我认为应该这样写:[DebuggerDisplay("Bar<{typeof(T).Name,nq}>")] - DavWEB
链接已损坏,根据 @DavWEB 的评论修正了拼写错误。 - Chuck Savage

2

[声明:我与OzCode有关联]

你可以使用OzCode的Reveal功能,支持嵌套/递归的调试信息。 enter image description here
一旦为一个实例定义了它,它将自动用于该类型的所有实例。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接