Используйте нулевой условный оператор для свойства нулевого объекта

Я хотел бы использовать оператор Null-Conditional для проверки свойства SubscriptionExpires ниже.

    public partial class Subscription
{
    [Key]
    public int SubscriptionId { get; set; }
    public string SubscriberId { get; set; }
    public DateTime? SubscriptionExpires { get; set; }

    public virtual ICollection<ApplicationUser> Users { get; set; }
}

Подписка возвращается

var subscription = _customersContext.Subscriptions.Where(s => s.SubscriptionId == user.SubscriptionId).FirstOrDefault();

Однако, если Subscription равно нулю, Subscription?.SubscriptionExpires возвращает null reference exception, так что мы по-прежнему остаемся со старым

if (subscription != null)

Как использовать оператор Null-Conditional для чтения свойства, когда родительский объект может быть нулевым?


person Vague    schedule 19.01.2016    source источник


Ответы (2)


Как использовать оператор Null-Conditional для чтения свойства, когда родительский объект может быть нулевым?

Вы делаете это так же, как и с Subscription?.SubscriptionExpires. Это не вызовет NullReferenceException, но вернет DateTime?. Если вы попытаетесь использовать значение DateTime?, вы получите исключение. Так что это не будет бросать:

var expiration = Subscription?.SubscriptionExpires;

Но это может:

DateTime? expiration = Subscription?.SubscriptionExpires;
DateTime expiration.Value;
person i3arnon    schedule 19.01.2016

Если вы хотите, чтобы "var expire" никогда не вызывал исключение при использовании его в качестве типа данных DateTime, вы можете использовать

var expiration = subscription?.SubscriptionExpires ?? DateTime.MinValue;
person Banketeshvar Narayan    schedule 21.01.2016
comment
Спасибо, @Banketeshvar Narayan, но зачем это нужно? Разве var не принимает возвращаемый тип... и если это значение null, разве это не нормально? - person Vague; 22.01.2016
comment
@LongwordsBotherme, условный оператор Null (?.) используется для обработки исключения ссылки Null и возврата только NULL вместо создания исключения. поэтому, если вы присвоите это нулевое значение истечению var, оно может вызвать исключение, когда вы назначаете истечение срока действия любой другой переменной DateTime, или вам нужно использовать DateTime? Ответ, данный i3arnon, на 100% правильный, но я только что дал альтернативу: если вы не хотите использовать типы данных Nullable (т.е. использовать DateTime вместо DateTime?) - person Banketeshvar Narayan; 22.01.2016