Лучший способ изменить обнуляемый тип, если не ноль, но вернуть ноль, если ноль уже - PullRequest
1 голос
/ 06 марта 2012

подобные вещи возникают постоянно,

это работает, но безобразно:

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 ]

5 голосов
/ 06 марта 2012

Вы можете добавить метод расширения к 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 не изменит тип между вызовами, конечно.

2 голосов
/ 06 марта 2012

Поскольку все операции над обнуляемыми типами распространяются с нулевым значением, кроме конкатенации , вы можете использовать:

DateTime? Day = ...; 
...
DateTime? firstDay = Day + TimeSpan.FromDays(-14); 
2 голосов
/ 06 марта 2012

Что не так с:

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

...