Подтвердить что ты не робот

DebuggerDisplay для универсального класса

У меня проблема с применением атрибута DebuggerDisplay для общего класса:

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

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

При проверке объекта типа Bar<Foo> я ожидаю, что он будет отображаться как Bar: --foo--, но я получаю Bar: {Foo}

Что я делаю неправильно?

4b9b3361

Ответ 1

Атрибут DebuggerDisplay не является рекурсивным. {} Внутри строки, по сути, оценивают это выражение и отображают результат inline. Строка для внутреннего результата вычисляется так, как будто в игре для типа или члена не было атрибута DebuggerDisplay. Вот почему вы видите {Foo} вместо --foo--.

Причиной этого является надежность. Слишком легко иметь взаимно рекурсивные атрибуты атрибутов DebuggerDisplay. Это может привести к переполнению стека или бесконечному циклу при оценке внутреннего выражения. Не рекурсивно оценивая атрибут DebuggerDisplay, он предотвращает эту бесконечную рекурсию (хотя пользователю вполне возможно создать его внутри определенного выражения).

Одним из способов управления внешним выражением является переопределение метода .ToString(). Это будет оценено при вычислении строки отображения для внутреннего выражения.

Ответ 2

[Отказ от ответственности: я связан с OzCode]

Вы можете использовать функцию OzCode Reveal, которая поддерживает вложенную/рекурсивную отладочную информацию. введите описание изображения здесь
После того, как вы определите его для экземпляра, он будет автоматически использован для всех экземпляров этого типа.