2015-02-09 2 views
5

Если у меня есть метод:Как компилятор понимает Nullables?

protected int CalculateActualDuration(DateTime? startDate, DateTime? endDate) { 
     if (startDate.HasValue && endDate.HasValue) { 
      return Math.Abs((int)(endDate.Value.Subtract(startDate.Value).TotalMinutes)); 
     } 
     else { 
      return 0; 
     } 
    } 

Я могу вызвать метод, передавая в обоих DateTime? и DateTime. Итак, как компилятор понимает разницу?

Означает ли это, если я прохожу в DateTime Значение, если заявление будет по существу soemthing как

if (true && true) 

и все * .value было изменено на соответствующих объектах? Итак, все endDate.Value теперь являются EndDates?

Включает ли компилятор все параметры, которые не являются Nullables в Nullables во время выполнения?

+0

Ответ на ваш последний вопрос: «Да». Подумайте о nullable DateTime как нормальном DateTime с приклеенным к нему Boolean, который указывает на его недействительность. Теперь ясно, как компилятор мог иметь дело с преобразованием нормального DateTime в нулевую DateTime? –

ответ

10

Все в вашем методе остается неизменным, а параметры startDate и endDate все еще являются экземплярами Nullable<T> struct.

Когда вы передаете "нормальный" DateTime к методу, вы принимаете преимущество implicit conversion указанных в Nullable<T> структуры:

public static implicit operator Nullable<T>(T value) { 
    return new Nullable<T>(value); 
} 

На странице MSDN связана выше:

Если значение не является null, значение Value нового значения Nullable к параметру значения, а свойство HasValue инициализируется значением true.

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