【问题标题】:Error Nullable object must have a value错误 Nullable 对象必须有一个值
【发布时间】:2015-08-12 19:29:41
【问题描述】:

好的,所以我正在做一个时间报告项目,只是为了熟悉 asp.net mvc5 和数据库以及所有爵士乐。

我可以报告一个日期,但我想报告几个日期。在我的控制器中,我为此做了这个:

            string d = form["date"];
            string[] dates = d.Split(' ');

            foreach (var date in dates)
            {
                if (!DateTime.TryParse(date, out reportDate))
                {
                    ModelState.AddModelError("Date", "Felaktikt datum");
                }

这是非常基本且直接的,每个日期都由一个空格分隔,我将日期添加到一个字符串数组中,并且对于该数组中的每个日期,它将执行代码。我的效果很好。

第一次运行它在第一次运行时一切正常,它报告了那个时间,但在循环中第二次我收到以下错误:Nullable object must have a value.

代码如下:

        for (int i = 0; i < Projects.Count; i++)
        {
            reportProjects[i] = new TimeReportProject
            {
                Description = Projects[i].Description,
                FK_ProjectID = Projects[i].ProjectId,
                FK_TimeReportID = ReportId.Value,
                Hours = Projects[i].Hours.Value,
                HourRate = db.GetProjectHourRate(Projects[i].ProjectId, Date, Projects[i].Hours.Value),
                TimeReportProjectID = Guid.NewGuid()
            };
        }

确切地说是Hours = Projects[i].Hours.Value,,该行第二次出现时为空。

所以为了解决这个问题,我只是做了一个非常基本的 nullcheck,现在该部分看起来像这样:

 for (int i = 0; i < Projects.Count; i++)
            {
                var hours = Projects[i].Hours;
                if (hours != null)
                    reportProjects[i] = new TimeReportProject
                    {
                        Description = Projects[i].Description,
                        FK_ProjectID = Projects[i].ProjectId,
                        FK_TimeReportID = ReportId.Value,
                       *Hours = hours.Value,
                        HourRate = db.GetProjectHourRate(Projects[i].ProjectId, Date, hours.Value),
                        TimeReportProjectID = Guid.NewGuid()
                    };
            }

这行得通,但是在它继续运行之后,我却被以下代码卡住了:

        public void AddToTimeReportProjects(TimeReportProject timeReportProject)
    {
        base.AddObject("TimeReportProjects", timeReportProject);
    }

这是错误:

System.Data.Entity.dll 中出现“System.ArgumentNullException”类型的异常,但未在用户代码中处理

附加信息:值不能为空。

首先,我不明白为什么它在运行第二个循环以将第二个日期添加到报告时不起作用,第一个效果很好,我一直在调试,它做的一切都是一样的。

【问题讨论】:

    标签: c# asp.net


    【解决方案1】:

    首先,在Nullable&lt;T&gt; 上调用Value 实际上表示您知道它有一个值,否则如果发现该值是null,它就会抛出异常。在致电Value 之前,您应该始终检查HasValue

    您可以使用Projects[i].Hours.GetValueOrDefault() 代替所有这些,当Hoursnull 时,它将为整数产生0

    我猜在你的第二个代码示例中,timeReportProjectnull,这显然是不允许的。

    【讨论】:

    • 但这似乎不是所希望的,即使这会导致下一个异常,也不应该初始化对象。所以我不确定OP是否想通过分配默认值来避免第二个异常。也许他只是想创建一个更小的数组。
    • 确实如此,但 OP 并没有问该怎么做,他已经知道了。但他问为什么会这样。
    • 当第一个循环在第一个日期等 2015 年 8 月 11 日运行时,小时数不为空,但是当所有这些都完成并报告了该日期并且它将执行第二次 2015-08-12 等小时将变为空,所以我确实添加了空检查。它确实捕捉到了它并再次运行它,下一次小时数回到 8。
    • 但是如果我在第二天使用 Projects[i].Hours.GetValueOrDefault() 我最终会得到 0 小时而不是第一天的 8 小时。
    • 那么在检索您的数据时有一个错误。当前的代码不足以说明任何事情,但它确实说明了为什么您最终会得到这些结果。您将这些数据保存在哪里?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-12
    • 1970-01-01
    • 2010-12-26
    • 1970-01-01
    • 2012-02-03
    • 1970-01-01
    相关资源
    最近更新 更多