Почему enum.ToString() дает результат, отличный от показанного во всплывающей подсказке отладчика?

Тестовая программа (.NET 2.0):

[Flags]
enum MyEnum
{
    Member1 = 1,
    Member2 = 2,
}

class Program
{
    // Inspecting r shows "Member1 | Member2"
    MyEnum r = MyEnum.Member1 | MyEnum.Member2;

    // s = "Member1, Member2"
    string s = r.ToString();
}

Я ожидал, что .ToString() вернет строку с элементами, разделенными вертикальной чертой, но это не так.

Информация о бонусе: вызов Enum.Parse() для строки, разделенной запятыми, завершается успешно, а предоставление строки, разделенной вертикальной чертой, завершается ошибкой.


person Jon Seigel    schedule 12.01.2010    source источник
comment
дополнительная информация - вы можете переопределить, как отладчик отображает ваши собственные классы с помощью [DebuggerDisplayAttribute]   -  person Jimmy    schedule 13.01.2010
comment
Спасибо за подсказку - всегда было интересно, как это делается.   -  person Jon Seigel    schedule 13.01.2010


Ответы (2)


Отладчик VS использует визуализаторы для отображения значений. Только если для определенного типа данных нет визуализатора, он будет использовать метод .ToString().

Подробнее о визуализаторах:

http://msdn.microsoft.com/en-us/library/zayyhzts.aspx

person Philippe Leybaert    schedule 12.01.2010

Реализация ToString по умолчанию для перечисления, отмеченного FlagsAttribute, представляет собой список, разделенный запятыми. Однако это не обязательно результат ToString, который отображается в отладчике — для перечислений должен быть настроен визуализатор отладчика, который отображает значения с побитовым символом OR или вертикальной чертой.

person David M    schedule 12.01.2010