2015-02-09 13 views
5

Wenn ich eine Methode haben:Wie versteht der Compiler 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; 
     } 
    } 

ich in der Lage bin sowohl ein Datetime die Methode aufzurufen, indem nebenbei? und eine DateTime. Wie also versteht der Compiler den Unterschied?

Heißt das, wenn ich in einem Datetime-Wert übergeben, die if-Anweisung soemthing wird im Wesentlichen wie

if (true && true) 

und alle * .value hat auf die richtigen Objekte verändert? Also sind alle endDate.Value alle jetzt EndDates?

Konvertiert der Compiler alle Parameter, die nicht Nullable sind, zur Laufzeit in Nullable?

+0

Die Antwort auf Ihre letzte Frage ist "Ja". Stellen Sie sich ein Nullable DateTime als normales DateTime mit einem Boolean vor, das darauf hinweist, dass es null ist. Jetzt ist es klar, wie der Compiler mit der Umwandlung einer normalen DateTime in eine Nullable DateTime umgehen konnte? –

Antwort

10

Alles in Ihrer Methode bleibt gleich, und die startDate und endDate Parameter sind immer noch Instanzen der .

Wenn Sie passieren eine "normale" DateTime die Methode, die Sie unter Ausnutzung der implicit conversion in der Nullable<T> Struktur angegeben:

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

Von der Seite MSDN oben verlinkten:

Wenn der Wert Parameter nicht Null ist, wird die Value Eigenschaft des neuen Werts Nullable initialisiert auf den Wert Parameter und die HasValue Eigenschaft wird auf True initialisiert.