我在一个泛型类上应用DebuggerDisplay
属性时遇到了问题:
[DebuggerDisplay("--foo--")]
class Foo
{
}
[DebuggerDisplay("Bar: {t}")]
class Bar<T>
{
public T t;
}
检查一个类型为
Bar<Foo>
的对象时,我希望它显示为Bar: --foo--
,但是我得到了Bar: {Foo}
。我做错了什么?我在一个泛型类上应用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("Bar<{typeof(T).Name,nq}>")]
。 - DavWEB