更改可空类型的最佳方法,如果不为null,但如果为null则返回null

Jac*_*ack 1 .net nullable

这种事情总是出现,

这有效但很难看:

DateTime? firstDay = null;
if (Day.HasValue) firstDay = Day.Value.AddDays(-14);
Run Code Online (Sandbox Code Playgroud)

这不起作用:

约会时间?firstDay = Day.HasValue?Day.Value.AddDays(-14):null;

除非:

DateTime? firstDay = Day.HasValue ? Day.Value.AddDays(-14) : (DateTime?)null;
Run Code Online (Sandbox Code Playgroud)

也许应该有另一个运营商!

DateTime? firstDay = Day ??? Day.Value.AddDays(-14);
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 5

您可以添加扩展方法 Nullable<T>

public static Nullable<T> TransformIfNotNull<T>(this Nullable<T> value,
                                                Func<T, T> transformer)
    where T : struct
{
    return value == null ? value : transformer(value.Value);
}
Run Code Online (Sandbox Code Playgroud)

然后:

DateTime? firstDay = Day.TransformIfNotNull(x => x.AddDays(-14));
Run Code Online (Sandbox Code Playgroud)

请注意,虽然使用null文字的版本在没有强制转换的情况下不起作用,但您可以使用:

DateTime? firstDay = Day.HasValue ? Day.Value.AddDays(-14) : Day;
Run Code Online (Sandbox Code Playgroud)

...当然,假设你知道Day不会改变通话之间的类型.