2015-04-20 2 views
2

У меня есть CanExecute для команды WPF, которая, похоже, работает по-разному в зависимости от того, насколько я явчен с компилятором; проблема в том, что я не ожидал бы, что должен быть явным.Почему у этого кода появляется ошибка?

private bool CanRemoveField() 
{ 
    return SelectedField != null && 
     Context.Item.Id == 0 
     ? _fieldsByFieldModel.ContainsKey(SelectedField) 
     : !_hasAnyCosts; 
} 

Приведенный выше код, когда запрошенный для пункта, где Id != 0 верно, кнопка включена несмотряSelectedField будучи null, так что я бы ожидать, что условное к короткому замыканию и вернуть false.

Код подправил немного:

private bool CanRemoveField() 
{ 
    return SelectedField != null && 
     (Context.Item.Id == 0 
     ? _fieldsByFieldModel.ContainsKey(SelectedField) 
     : !_hasAnyCosts); 
} 

Я ввел некоторые скобки вокруг троичного, если, и это теперь, показывает желаемое поведение отключения кнопки, если не выбрано ни одного поля.

Учитывая тот факт, что это тройной, если бы я ожидал, что поведение, которое я хотел бы сделать возможным, без необходимости в круглых скобках, поскольку его следует рассматривать только как одно утверждение, нет?

+2

Имейте в виду: [Это всегда ваша ошибка] (http://blog.codinghorror.com/the-first-rule-of-programming-its -всегда ваша ошибка /) –

ответ

5

The вы видите смысл, так как the && logical-and operator has a higher precedence than the ? : conditional expression результаты.

Таким образом, ваш первый фрагмент кода, по существу:

return (SelectedField != null && Context.Item.Id == 0) 
    ? _fieldsByFieldModel.ContainsKey(SelectedField) 
    : !_hasAnyCosts; 
+1

Спасибо! Приоритет оператора имеет смысл, я думаю, я просто предположил, что он будет относиться к тройной, если в качестве группы. – Clint

8

Из-за приоритета операторов, ваш первый пример эквивалентен:

private bool CanRemoveField() 
    { 
    return (SelectedField != null && 
     Context.Item.Id == 0) 
     ? _fieldsByFieldModel.ContainsKey(SelectedField) 
     : !_hasAnyCosts; 
    }