У меня проблема с применением атрибута 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
Я считаю, что это должно читаться: [DebuggerDisplay("Bar<{typeof(T).Name,nq}>")]
Спасибо! Полагаю, это не имело ничего общего с универсальностью. Я выберу решение ToString.