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

时间:2012-03-05 20:47:05

标签: .net nullable

这种事情一直都会出现,

这很有效,但很难看:

DateTime? firstDay = null;
if (Day.HasValue) firstDay = Day.Value.AddDays(-14);

这不起作用:

的DateTime? firstDay = Day.HasValue? Day.Value.AddDays(-14):null;

除非:

DateTime? firstDay = Day.HasValue ? Day.Value.AddDays(-14) : (DateTime?)null;

也许应该有另一个操作员!

DateTime? firstDay = Day ??? Day.Value.AddDays(-14);

3 个答案:

答案 0 :(得分: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);
}

然后:

DateTime? firstDay = Day.TransformIfNotNull(x => x.AddDays(-14));

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

DateTime? firstDay = Day.HasValue ? Day.Value.AddDays(-14) : Day;

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

答案 1 :(得分:2)

出了什么问题:

DateTime? firstDay = Day.HasValue ? Day.Value.Add(-14) : Day;

答案 2 :(得分:2)

all operations on nullable types are null-propagating except concatenation起,您可以使用:

DateTime? Day = ...; 
...
DateTime? firstDay = Day + TimeSpan.FromDays(-14);