我有一个泛型类应用DebuggerDisplay
属性的问题:DebuggerDisplay对泛型类
[DebuggerDisplay("--foo--")]
class Foo
{
}
[DebuggerDisplay("Bar: {t}")]
class Bar<T>
{
public T t;
}
当检查Bar<Foo>
类型的对象,我希望它显示为Bar: --foo--
,但我得到Bar: {Foo}
我在做什么错?
我有一个泛型类应用DebuggerDisplay
属性的问题: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()方法。计算内部表达式的显示字符串时将对此进行评估。
您可以使用[DebuggerDisplay("Bar<{typeof(T).Name}>,nq}")]//nq - no quotes
。
您也可以使用这些做法: DebuggerDisplay attribute best practices
我相信它应该是: `[DebuggerDisplay(“Bar <{typeof(T).Name,nq}>”)]` – DavWEB 2017-05-18 11:06:16
谢谢!因此,我想,这与通用性无关。 我会去ToString解决方案。 – 2008-11-03 15:27:24