C #: Verwenden Sie Coalesing oder Ternary Operator mit Datetime Nullable

Sep 11 2020

Wie verwende ich den Null Coalescing Operator mit Datetime Nullable in C #? Versuch, eine einzeilige Anweisung in einer Auswahl in Linq-Abfrage zu erstellen. Folgendes funktioniert nicht

select new ProductRDto
{
    EffectiveEndDate = timeslice.EffectiveEndDate.HasValue ?? timeslice.EffectiveEndDate.Value.Year : null 

Ternary Operator erstellt diesen Fehler

Fehler: Operator '??' kann nicht auf Operanden vom Typ 'bool' und 'int' angewendet werden.

  EffectiveEndDate = timeslice.EffectiveEndDate.HasValue ? timeslice.EffectiveEndDate.Value.Year : null

Fehler: Der Typ des bedingten Ausdrucks kann nicht bestimmt werden, da keine implizite Konvertierung zwischen 'int' und 'null' erfolgt.

* versucht, if-else-Anweisungen nicht zu verwenden

Antworten

5 JonSkeet Sep 11 2020 at 03:24

Angenommen, Sie möchten tatsächlich das Jahr timeslice.EffectiveEndDate, in dem dies nicht null ist, oder ansonsten einen Nullwert. Die einfachste Option besteht darin, weder den bedingten Operator noch den Null-Koaleszenzoperator zu verwenden. Verwenden Sie stattdessen den nullbedingten Operator :

int? year = timeslice.EffectiveEndDate?.Year;

Sie würden den Null-Koaleszenz-Operator verwenden, um einen anderen Wert anstelle von EffectiveEndDatez

DateTime? date = timeslice.EffectiveEndDate ?? defaultEndDate;

Wenn Sie stattdessen den bedingten Operator verwenden möchten, müssen Sie nur angeben, dass der nullWert vom Typ sein soll int?:

int? year = timeslice.EffectiveEndDate.HasValue
    ? timeslice.EffectiveEndDate.Value.Year
    : (int?) null;
1 rory.ap Sep 11 2020 at 03:23

Sie verwechseln den Null-Koaleszenz-Operator mit dem ternären Operator. Sie möchten nur eine verwenden ?.

EffectiveEndDate = timeslice.EffectiveEndDate.HasValue
    ? timeslice.EffectiveEndDate.Value.Year : null;