typeof (System.Enum) .IsClass == false - PullRequest
       16

typeof (System.Enum) .IsClass == false

4 голосов
/ 02 ноября 2009

Основано, что:

typeof(System.Enum).IsClass == false

Странно, что System.Enum также имеет .IsValueType == false, но Reflector показывает, что это действительно abstract class.

System.Enum - это ссылочный тип, такой как System.ValueType и приведение значений перечисления к / из System.Enum ссылки вызвало упаковку / распаковку Здесь нет сюрпризов.

Но с какой стати класс Type не говорит правду о природе System.Enum? В поведении отражения типа System.Enum нет ничего экстраординарного, чтобы он выглядел не как ссылочный тип.

Ответы [ 2 ]

6 голосов
/ 02 ноября 2009

Это проблема с .Net 1.1 и 2.0. Я не проверял это в 3.0

От пользователя MSDN Дэвид Бернштейн

Свойство IsClass типа System.Enum возвращает «false», хотя «System.Enum» наследуется от «System.ValueType» и «typeof (System.ValueType) .IsClass» возвращает «true» (как и ожидалось) , В то же время typeof (System.Enum) .IsValueType возвращает «false», как и ожидалось. Это наблюдаемое поведение, кажется, противоречит явной документации выше, которая предусматривает: «Это свойство возвращает true для экземпляров Type, представляющих Enum и ValueType.» Я обнаружил, что это имеет место в обеих платформах 1.1 и 2.0.

3 голосов
/ 17 октября 2011

Недавно я снова посетил эту проблему в CLR4 и угадаю, что она исправлена. Следующие определения:

public struct SomeValueType{}

public enum SomeEnum
{
    FirstElement
}

с этой программой

Console.WriteLine( typeof( Enum ).IsClass );
Console.WriteLine( typeof( SomeEnum ).IsClass );

Console.WriteLine( typeof( ValueType).IsClass );
Console.WriteLine( typeof( SomeValueType).IsClass );

Дает следующие результаты:

CLR2: False, False, True, False 
CLR4: True, False, True, False
...