C #: use un operador combinado o ternario con Datetime Nullable

Sep 11 2020

¿Cómo utilizo Null Coalescing Operator con Datetime Nullable en C #? Intentando crear una declaración de una sola línea, en una consulta de selección en Linq. Lo siguiente no funciona

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

El operador ternario crea este error

Error: operador '??' no se puede aplicar a operandos de tipo 'bool' e 'int'

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

Error: el tipo de expresión condicional no se puede determinar porque no hay una conversión implícita entre 'int' y 'null'

* tratando de no utilizar declaraciones if-else

Respuestas

5 JonSkeet Sep 11 2020 at 03:24

Suponiendo que lo que realmente desea es el año de timeslice.EffectiveEndDatesi eso no es nulo, o un valor nulo de lo contrario, la opción más simple no es usar el operador condicional o el operador coalescente nulo; use el operador condicional nulo en su lugar:

int? year = timeslice.EffectiveEndDate?.Year;

Usaría el operador de fusión nula para usar un valor diferente en lugar de EffectiveEndDate, por ejemplo

DateTime? date = timeslice.EffectiveEndDate ?? defaultEndDate;

Si desea utilizar el operador condicional en su lugar, solo necesita especificar que desea que el nullvalor sea del tipo int?:

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

Está mezclando el operador coalescente nulo con el operador ternario. Quieres usar solo uno ?.

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