错误Nullable对象必须具有值

时间:2015-08-12 11:16:14

标签: c# asp.net

好吧,所以我正在制作一个时间报告项目,只是为了熟悉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对象必须有一个值。

这是在这段代码:

        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,,第二次出现时,该行变为空。

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

 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);
    }

这是错误:

类型&#39; System.ArgumentNullException&#39;的异常发生在System.Data.Entity.dll中但未在用户代码中处理

附加信息:值不能为空。

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

1 个答案:

答案 0 :(得分:2)

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

而不是所有这些,您可以使用Projects[i].Hours.GetValueOrDefault(),当0Hours时,null会产生timeReportProject个整数。

我想在您的第二个代码示例中,nullclass ViewController: UIViewController, UIGestureRecognizerDelegate { override func viewDidLoad() { super.viewDidLoad() let edgeGestureRecognizer = UIScreenEdgePanGestureRecognizer(target: self, action: "userSwipedFromEdge:") edgeGestureRecognizer.edges = UIRectEdge.Left edgeGestureRecognizer.delegate = self self.view.addGestureRecognizer(edgeGestureRecognizer) } func userSwipedFromEdge(sender: UIScreenEdgePanGestureRecognizer) { if sender.edges == UIRectEdge.Left { print("It works!") } } } ,显然不允许这样做。