C# 调试程序显示在泛型类上
在泛型类上应用C# 调试程序显示在泛型类上,c#,.net,visual-studio,debugging,C#,.net,Visual Studio,Debugging,在泛型类上应用DebuggerDisplay属性时出现问题: [DebuggerDisplay("--foo--")] class Foo { } [DebuggerDisplay("Bar: {t}")] class Bar<T> { public T t; } [DebuggerDisplay(“--foo-->”) 福班 { } [调试器显示(“条:{t}”)] 分类栏 { 公共交通; } 当检查类型为Bar的对象时,我希望它显示为Bar:--foo--,但我得到
DebuggerDisplay
属性时出现问题:
[DebuggerDisplay("--foo--")]
class Foo
{
}
[DebuggerDisplay("Bar: {t}")]
class Bar<T>
{
public T t;
}
[DebuggerDisplay(“--foo-->”)
福班
{
}
[调试器显示(“条:{t}”)]
分类栏
{
公共交通;
}
当检查类型为Bar
的对象时,我希望它显示为Bar:--foo--
,但我得到Bar:{foo}
我做错了什么?DebuggerDisplay属性不是递归的。字符串中的{}实质上表示计算此表达式并内联显示结果。计算内部结果的字符串时,就好像没有类型或成员的DebuggerDisplay属性一样。这就是为什么你看到的是{Foo}而不是--Foo-- 原因是可靠性。使用相互递归的DebuggerDisplay属性标记太容易了。这将导致在计算内部表达式时发生堆栈溢出或无限循环。不递归地计算DebuggerDisplay属性可以防止这种无限递归(尽管用户仍然可以在特定表达式中自己创建它)
控制内部表达式显示方式的一种方法是重写.ToString()方法。这将在计算内部表达式的显示字符串时进行计算。您可以使用
[DebuggerDisplay(“Bar,nq}”)]//nq-无引号
您还可以使用以下做法:
[免责声明:我与OzCode有关联]
您可以使用OzCode的显示功能,该功能支持嵌套/递归调试信息。
一旦为实例定义了它,它将自动用于该类型的所有实例。谢谢!所以我想这与通用无关。我会选择ToString解决方案。我相信它应该是:
[DebuggerDisplay(“Bar”)]