【问题标题】:Use Null Conditional Operator on property of Null Object对 Null 对象的属性使用 Null 条件运算符
【发布时间】:2016-01-19 05:48:53
【问题描述】:

我想使用空条件运算符来检查下面的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)

当父对象可以为空时,如何使用空条件运算符读取属性?

【问题讨论】:

    标签: c# entity-framework-core c#-6.0


    【解决方案1】:

    当父对象可以为空时,如何使用空条件运算符读取属性?

    您可以像使用 Subscription?.SubscriptionExpires 一样执行此操作。这不会抛出NullReferenceException,但会返回DateTime?。如果你尝试使用DateTime? 的值,那么你会得到一个异常。所以这不会抛出:

    var expiration = Subscription?.SubscriptionExpires;
    

    但这可能:

    DateTime? expiration = Subscription?.SubscriptionExpires;
    DateTime expiration.Value;
    

    【讨论】:

      【解决方案2】:

      如果您希望 "var expiration" 在将其用作 DateTime 数据类型时永远不要抛出异常,您可以使用

      var expiration = subscription?.SubscriptionExpires ?? DateTime.MinValue;
      

      【讨论】:

      • 谢谢@Banketeshvar Narayan,但为什么有必要这样做? var 不接受返回的任何类型......如果它是 null,那不是 ok 吗?
      • @LongwordsBotherme,Null 条件运算符 (?.) 用于处理 Null 引用异常并仅返回 NULL 而不是抛出异常。因此,如果您将该空值分配给“var expiration”,那么它可能会在您分配“到期”任何其他 DateTime 变量时引发异常,或者您必须使用 DateTime? i3arnon 给出的答案是 100% 正确的,但如果您不想使用 Nullable 数据类型(即使用 DateTime 而不是 DateTime?),我刚刚给出了替代方案
      猜你喜欢
      • 1970-01-01
      • 2017-02-17
      • 2015-05-17
      • 2022-08-02
      • 1970-01-01
      • 2014-10-08
      • 1970-01-01
      • 2015-10-11
      • 1970-01-01
      相关资源
      最近更新 更多