2016-07-15 4 views
-2

Я немного удивлен, обнаружив, что вызов конструктора в:значение перечисления по умолчанию (T) не равна нулю

class MyClass<T> 
{ 
    public MyClass() 
    { 
     if (default(T) == null) 
      Debugger.Break(); 
    } 
} 

не ломаются, когда T является перечисление. Зачем? Кажется, что даже для перечислений default(T) и null должны быть эквивалентными.

+0

Почему? Любая ссылка на документацию, которая заставила вас поверить в это? (вы можете прочитать http://stackoverflow.com/questions/65351/null-or-default-comparison-of-generic-argument-in-c-sharp, если вам нужно сравнить параметры с «null») –

+0

См. http://stackoverflow.com/questions/4967656/what-is-the-default-value-for-enum-variable – seairth

+0

Resharper должен был дать вам предупреждение. –

ответ

2

Отсутствует тип значения никогда не собирается испытать равным null, если это не Nullable<T>, который имеет специальный компилятор и языковую поддержку для лечения в отключенное значение, как null.

default(T), где T - любой тип значения, включая перечисление, будет любым значением, заполненным 0 для этого типа. То есть фактическое значение. Не более null.


Дополнительное чтение: How to set enum to null
What does default(object); do in C#?

Вы также можете прочитать некоторые из других хитов в этом поиске: [c#] default value enum null

+0

Справа. Вот почему ключевое слово 'default' было введено для C# для начала. Я просто считаю несколько неинтуитивным, что «0-заполненное значение» отличается от «null». Поэтому причина не сразу была очевидна. – HappyNomad

+0

_ «Вот почему ключевое слово по умолчанию было введено для C#, чтобы начать с« _ - На самом деле, это _usage_ ключевого слова 'default' (всегда было' default' в инструкции 'switch') было введено для поддержки общего кода, который необходимо иметь возможность всегда создавать значение по умолчанию, не зная фактического типа. То, что это происходит, заканчивается тем, что значение, заполненное 0, - это вопрос удобства и эффективности, как и все остальное. Точно так же, что 'null' внутренне представлен как' 0', является вопросом удобства; «null» - это особое значение, имеющее смысл только при работе со ссылочными типами. –

+0

«' null »- это особое значение, имеющее смысл только при работе со ссылочными типами». Именно та часть, которую я нахожу неинтуитивной. Однако при более глубоком рассмотрении разница очевидна. Если значение по умолчанию типа значения по-прежнему является фактическим значением, значение по умолчанию ссылочного типа ('null') является * недостатком * значения. – HappyNomad

1

Поскольку перечисление в .net является типом значения. Если вы хотите узнать только, default(T) == null, то вы можете проверить, является ли это ссылочным типом.

class MyClass<T> 
{ 
    public MyClass() 
    { 
     if (typeof (T).IsClass) 
     { 
      Debugger.Break(); 
     } 
     else if (typeof (T).IsValueType) 
     { 
      //do something 
     } 
    } 
} 
+0

Это не дает ответа на вопрос. Чтобы критиковать или просить разъяснения у автора, оставьте комментарий ниже их сообщения. - [Из обзора] (/ review/low-quality-posts/13012680) –

+1

@EdvinTenovim Ответ обновлен. –

+0

Ответ был обновлен. Может кто-то отменить голосование? –

Смежные вопросы