2015-04-24 14 views
0

Попытка понять поведение по умолчанию GetValueOrDefault(). Если у меня есть свойство nullable, GetValueOrDefault() возвращает базовое значение по умолчанию или значение экземпляра null ... потому что это значение экземпляра (null) будет значением, поэтому нам не нужно получать значение по умолчанию.Когда значение NULL не равно NULL?

Например:

namespace Nullable_test 
{ 
    public class AutoPropNullTest 
    { 
    public int? AutoValue { get; set; } 
    } 

    public class ManualPropNullTest 
    { 

     private int? i; 

     public int? ManualValue 
     { 
     get 
     { 
      return i; 
     } 

     set 
     { 
      i = value; 
     } 
     } 
    } 
} 

выше будет экземпляр с нулевыми значениями, но вызов ValueOrDefault вернет ноль.

 ManualPropNullTest x = new ManualPropNullTest(); 

     AutoPropNullTest y = new AutoPropNullTest(); 

     //x & y will inspect as null 

     int? q = x.ManualValue.GetValueOrDefault(); 

     //q will result in zero 

Я понимаю, что это тип волос вопрос расщепления просто пытается согласовать с тем, что я думаю, что по умолчанию должно быть и что такое реальность.

Спасибо

+8

'ValueOrDefaultValueForTheUnderlyingType' слишком длинный для ввода. – asawyer

+0

Или даже 'ValueOrDefaultForTheUnderlyingValueType' – xanatos

+3

Да,' GetValueOrDefault() 'вернет 0 - что вы ожидали от этого? Обратите внимание, что вы можете показать точно такой же эффект с локальной переменной - нет необходимости в этих свойствах ... –

ответ

4

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

Но обратите внимание, что значение null означает отсутствие значения, а не какое-либо значение по умолчанию.

Когда вы звоните GetValueOrDefault(), что вы просите за это ненулевым значением от значения Nullable<T> или собственного значение по умолчанию типа -значения, если значение Nullable<T> фактически «нулевой».

В этом случае вы должны ожидать базовое значение по умолчанию. Именно этот метод и призван вернуться. Обратите также внимание на то, что это фактически фактическое значение , и поэтому, если оно назначено на еще одну переменную Nullable<T>, будет считаться ненулевой (то есть значение присутствует).

+0

определение null является отсутствием значения ... это объяснение, которое мне нужно. – GPGVM

3

«значение по умолчанию» является фактически:

Тип значения по умолчанию является аргументом типа текущего Nullable объекта, а значение значения по умолчанию состоит только из бинарных нулей.

От MSDN.

Таким образом, чтобы ответить на ваш вопрос, его значение, равное двоичному нулю, будет иметь аргумент типа.

1

GetValueOrDefault возвращает значение по умолчанию (T), если HasValue в Nullable является ложным. (Значение по умолчанию (int) равно 0)

0

Значение по умолчанию для int (Int32) равно 0. int? (Nullable) не имеет целочисленного значения, поэтому он возвращает значение по умолчанию для int, которое равно 0.

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