En el siguiente ejemplo, estoy devolviendo un DateTimeOffset? utilizando el valor default
var a = ConvertToDateTimeOffsetA(null); // 1/1/0001 12:00:00 AM +00:00 var b = ConvertToDateTimeOffsetB(null); // null private static DateTimeOffset? ConvertToDateTimeOffsetA(DateTime? date) { return date != null ? new DateTimeOffset(date.Value, TimeSpan.Zero) : default; } private static DateTimeOffset? ConvertToDateTimeOffsetB(DateTime? date) { if (date != null) return new DateTimeOffset(date.Value, TimeSpan.Zero); return default; }¿Por qué hay una diferencia entre la salida devuelta en el ternario en comparación con la declaración if?
Supongo que el ternario primero obliga al tipo a DateTimeOffset y luego en línea se convierte de nuevo a Nullable<DateTimeOffset> , pero no estoy muy seguro de por qué.
En la versión ternaria, está interpretando su default como default(DateTimeOffset) , el otro tipo de expresión de salida en el condicional. Entonces está interpretando el ternario en su conjunto como anulable, que nunca será nulo.
En el segundo caso, su devolución utiliza default(DateTimeOffset?) , del tipo de devolución declarado.
En este caso, es posible que desee usar un tipo explícito en la expresión default , o simplemente use la segunda forma y agregue un comentario (e idealmente una prueba unitaria), para que nadie lo "arregle" en el futuro.