好吧,所以我正在制作一个时间报告项目,只是为了熟悉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中但未在用户代码中处理
附加信息:值不能为空。
首先,我不明白为什么当它运行第二个循环以将第二个日期添加到报告时它不起作用,第一个工作很好我已经调试并且它做的一切都是一样的。
答案 0 :(得分:2)
首先,在Value
上调用Nullable<T>
实际上表示您知道它有值,否则如果发现值为null
则会抛出异常。在致电HasValue
之前,您应该始终检查Value
。
而不是所有这些,您可以使用Projects[i].Hours.GetValueOrDefault()
,当0
为Hours
时,null
会产生timeReportProject
个整数。
我想在您的第二个代码示例中,null
为class 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!")
}
}
}
,显然不允许这样做。