1

Я установил свойство bool, чтобы предотвратить или разрешить команду для запуска на основе того, что для этого bool установлено значение true.Как разрешить исключение InvalidOperationException при условии Bool?

В текущей реализации я проверяю внутри bool, что определенные значения не равны нулю, прежде чем установить bool в значение true.

Вопрос:

Почему я получаю InvalidOperationException о состоянии внутри BOOL?

Обзор коды:

Bool свойство CanSendCommand, который используется в качестве паров в команде реле ниже:

private bool CanSendCommand() 
{ 
    if (SelectedParkDuration.Value != null && RegNumber != string.Empty && SelectedZone.ZoneName != null) 
    { 
     return true; 
    } 

    return false; 
} 

TagRequestCommand который вызывается первоначально в методе нагрузки на класс initilization. Сама команда связана с нажатием кнопки на пользовательском интерфейсе.

Для контекста RegNumber является тип строки, SelectedParkingDuration является TimeSpan, и SelectedZone.ZoneName является строкой в ​​собственности:

private void LoadCommands() 
    { 
     TagRequestCommand = new RelayCommand(async() => 
     { 
      await SendParkingTagSMSRequest(); 
     } ,CanSendCommand); 
    } 

Я скопировал сведения об исключении, которое говорит мне значения для условия являются нулевыми, что должно быть хорошо, поскольку оно обрабатывается в состоянии bool. Я вижу тогда, что есть строка, указывающая на то, что «Объект Nullable должен иметь значение», который говорит мне, что, возможно, свойство 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: 

Скриншот из автоманьяка окна во время выполнения:

enter image description here

ответ

1

Простой код в 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 предположить, что использование неверно, иначе, если вы ожидаете, что значение будет Null, тогда не следует использовать Value property.

Для того, чтобы выше код работы закомментируйте строку:

// Test.SelectedParkDuration = 5; 

Проверить это link слишком