1

私はboolプロパティを設定して、そのブール値がtrueに設定されていることに基づいてコマンドを実行させないようにしました。Bool条件でInvalidOperationExceptionを解決するにはどうすればよいですか?

現在の実装では、boolをtrueに設定する前に特定の値がnullでないことをブール内でチェックします。

質問:

は、なぜ私はブール内の条件にInvalidOperationExceptionが入手できますか?コードの

概要:

ブールプロパティCanSendCommand、以下リレーコマンドにPARAMとして使用される:クラスinitilizationの負荷方法で最初に呼び出され

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

    return false; 
} 

TagRequestCommand。コマンド自体は、UIのボタンを押すことにバインドされています。

状況について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

シンプルコード:あなたは、単にSelectedParkDuration != null

詳しい情報を確認することができますNull Reference exceptionとなります.NetはInvalid Operation Exceptionを使用することを推奨しています。そうでない場合は値がNullになることを期待する場合はValue propertyを使用しないでください。

// Test.SelectedParkDuration = 5; 

このlinkあまりに

を確認してください:コードワークコメントの上にラインを作るために

1

SelectedParkDuration.Value != nullが例外をスローした部分であるように見えます。それは他に、あなたはTest.SelectedParkDuration.Value;が成功になりたい場合は

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;} 
} 

は、その後、最初の割り当て:あなたが示唆しているシナリオを再現するLinqpadにhttps://msdn.microsoft.com/en-us/library/ydkbatt6(v=vs.110).aspx