当我点击提交按钮时没有输入任何日期或时间,有人能帮我弄清楚为什么我会收到这个错误消息吗?
类型'System.InvalidOperationException‘的异常发生在mscorlib.dll中,但未在用户代码中处理附加信息:可空对象必须具有一个值。

int result1 = this.startDate.SelectedDate.Value.Date.CompareTo(DateTime.Now.Date);
int result2 = this.endDate.SelectedDate.Value.Date.CompareTo(this.startDate.SelectedDate.Value.Date);
if (result1 >= 0 && result2 > 0)
{
//To Do navigate to sprint dashboard
// var userProjects = new UserStory();
//var sprintDashboardPage = new SprintDashboardPage(usersProjects);
//var mainWindow = this.GetWindow() as MainWindow;
//mainWindow.MainFrame.Navigate(sprintDashboardPage);
this.ErrorMessage = "Date is VALID";
this.CloseWindow();
}
else
{
this.ErrorMessage = "Choose Valid Date";
}发布于 2016-11-24 23:12:23
this.startDate.SelectedDate是Nullable<DateTime>。这意味着您必须检查this.startDate.SelectedDate在使用它之前是否有一个赋值:
if(this.startDate.SelectedDate.HasValue) {
this.startDate.SelectedDate.Value.Date.CompareTo(DateTime.Now.Date);
}以下内容也将发挥作用:
if(this.startDate.SelectedDate != null) {
this.startDate.SelectedDate.Value.Date.CompareTo(DateTime.Now.Date);
}在访问this.endDate.SelectedDate时也是如此。
在C#中,DateTime是值类型,这意味着它必须始终具有分配给它的值。换句话说,它不能设置为null。它的默认值是DateTime.MinValue。Int32 (或int)是值类型的另一个示例,其默认值为0。
为了使值类型支持为空,可以使用Nullable<>包装它。这样做意味着您必须在访问该值之前显式检查是否已分配了一个值,否则将抛出一个InvalidOperationException。
WPF中的DateTime选择器控件返回一个Nullable<DateTime>对象,这样您就可以知道用户是否在控件中实际选择了一个值,因为它将被设置为一个非空值。
发布于 2016-11-24 22:58:13
您在没有首先检查其Value属性返回true的情况下调用Nullable<>上的HasValue属性。
发布于 2016-11-24 22:59:54
异常将抛出在.Value属性的DateTime? (可空DateTime)中,因为它是返回DateTime所必需的,但不能返回,因为没有要返回的DateTime。
访问Nullable类型的.Value属性而不检查它是个坏主意。您应该考虑添加空检查代码。(例如具有HasValue属性)
https://stackoverflow.com/questions/40795471
复制相似问题