2015-02-09 15 views
5

Ben bir yöntemi varsa: bir DateTime hem de geçerek yöntemi çağırmak mümkün duyuyorumDerleyici Nullables'i nasıl anlıyor?

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; 
     } 
    } 

? ve bir DateTime. Peki derleyici farkı nasıl anlıyor? Ben bir DateTime Değerindeki

if (true && true) 

ve tüm * .value uygun nesneler olarak değiştirildi gibi deyimi esasen olacaksa soemthing geçirirseniz

anlamına mı geliyor? Yani tüm endDate.Value şimdi tüm EndDates?

Derleyici, çalışma zamanı boyunca Nullables olmayan tüm parametreleri Nullables'e döküyor mu?

+0

Son sorunuzun cevabı "evet". Null bir DateTime'ı, normal bir DateTime olarak düşünerek, onun bir boşluğunu gösteren bir Boolean ile düşünün. Şimdi derleyicinin normal bir DateTime'ı null bir DateTime'a dönüştürmeyi nasıl başarabileceği açık mı? –

cevap

10

Yöntemdeki her şey aynı kalır ve startDate ve endDate parametreleri hala Nullable<T> struct örneğidir.

Eğer Nullable<T> yapı içinde belirtilen implicit conversion bir "normal" bir yönteme DateTime, sen alıyorsun avantajını geçtikten sonra:

: Yukarıda bağlantılı

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

MSDN sayfasından değeri parametresi numaralı değilse, yeni Nullable değerinin Value özelliği başlatılır değer parametresine ve HasValue özelliği, true'a başlatıldı.