如何解决 Bool 条件下的 InvalidOperationException?
How to resolve an InvalidOperationException on Bool condition?
我已经设置了一个 bool 属性 来阻止或允许基于该 bool 设置为 true 的命令触发。
在当前的实现中,我在将 bool 设置为 true 之前在 bool 中检查某些值不为 null。
问题:
为什么我在 bool 内的条件下得到 InvalidOperationException?
代码概览:
Bool 属性 CanSendCommand
,在下面的 Relay 命令中用作参数:
private bool CanSendCommand()
{
if (SelectedParkDuration.Value != null && RegNumber != string.Empty && SelectedZone.ZoneName != null)
{
return true;
}
return false;
}
TagRequestCommand
最初在 class 初始化的加载方法中调用。命令本身绑定到 UI.
上的按钮按下
上下文 RegNumber 是字符串类型,SelectedParkingDuration 是 ?TimeSpan,SelectedZone.ZoneName 是 属性:
中的字符串
private void LoadCommands()
{
TagRequestCommand = new RelayCommand(async () =>
{
await SendParkingTagSMSRequest();
} ,CanSendCommand );
}
我已经复制了异常详细信息,它告诉我条件的值为空,这应该没问题,因为它在 bool 条件中进行了处理。然后我看到有一条线指向 "Nullable object must have a value",它告诉我也许我的 Timespan 属性 SelectedParkDuration 应该有一个值。但是我不确定在选择值之前它如何具有值。
System.InvalidOperationException was unhandled by user code
HResult=-2146233079
Message=Nullable object must have a value.
Source=mscorlib
StackTrace:
at System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource resource)
at System.Nullable`1.get_Value()
at Parking_Tag_Picker_WRT.ViewModel.TagRequestViewModel.CanSendCommand()
InnerException:
运行时自动 windows 的屏幕截图:
看起来 SelectedParkDuration.Value != null
是抛出异常的部分。您可以简单地检查 SelectedParkDuration != null
更多信息:https://msdn.microsoft.com/en-us/library/ydkbatt6(v=vs.110).aspx
在 Linqpad 中重现您建议的场景的简单代码:
void Main()
{
// Test.SelectedParkDuration = 5;
var result = Test.SelectedParkDuration.Value; // Invalid operation exception with above line commented out
result.Dump();
}
public class Test
{
public static int? SelectedParkDuration { get; set;}
}
如果要Test.SelectedParkDuration.Value;
成功,那么先赋值,否则就是Null Reference exception
,.Net更喜欢Invalid Operation Exception
提示用法不正确,else如果你期望值为 Null 则不应使用 Value property
.
要使上面的代码正常工作,请注释掉以下行:
// Test.SelectedParkDuration = 5;
也检查这个link
我已经设置了一个 bool 属性 来阻止或允许基于该 bool 设置为 true 的命令触发。
在当前的实现中,我在将 bool 设置为 true 之前在 bool 中检查某些值不为 null。
问题:
为什么我在 bool 内的条件下得到 InvalidOperationException?
代码概览:
Bool 属性 CanSendCommand
,在下面的 Relay 命令中用作参数:
private bool CanSendCommand()
{
if (SelectedParkDuration.Value != null && RegNumber != string.Empty && SelectedZone.ZoneName != null)
{
return true;
}
return false;
}
TagRequestCommand
最初在 class 初始化的加载方法中调用。命令本身绑定到 UI.
上下文 RegNumber 是字符串类型,SelectedParkingDuration 是 ?TimeSpan,SelectedZone.ZoneName 是 属性:
中的字符串 private void LoadCommands()
{
TagRequestCommand = new RelayCommand(async () =>
{
await SendParkingTagSMSRequest();
} ,CanSendCommand );
}
我已经复制了异常详细信息,它告诉我条件的值为空,这应该没问题,因为它在 bool 条件中进行了处理。然后我看到有一条线指向 "Nullable object must have a value",它告诉我也许我的 Timespan 属性 SelectedParkDuration 应该有一个值。但是我不确定在选择值之前它如何具有值。
System.InvalidOperationException was unhandled by user code
HResult=-2146233079
Message=Nullable object must have a value.
Source=mscorlib
StackTrace:
at System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource resource)
at System.Nullable`1.get_Value()
at Parking_Tag_Picker_WRT.ViewModel.TagRequestViewModel.CanSendCommand()
InnerException:
运行时自动 windows 的屏幕截图:
看起来 SelectedParkDuration.Value != null
是抛出异常的部分。您可以简单地检查 SelectedParkDuration != null
更多信息:https://msdn.microsoft.com/en-us/library/ydkbatt6(v=vs.110).aspx
在 Linqpad 中重现您建议的场景的简单代码:
void Main()
{
// Test.SelectedParkDuration = 5;
var result = Test.SelectedParkDuration.Value; // Invalid operation exception with above line commented out
result.Dump();
}
public class Test
{
public static int? SelectedParkDuration { get; set;}
}
如果要Test.SelectedParkDuration.Value;
成功,那么先赋值,否则就是Null Reference exception
,.Net更喜欢Invalid Operation Exception
提示用法不正确,else如果你期望值为 Null 则不应使用 Value property
.
要使上面的代码正常工作,请注释掉以下行:
// Test.SelectedParkDuration = 5;
也检查这个link