如何解决 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