C # условное утверждение - PullRequest
       25

C # условное утверждение

0 голосов
/ 11 января 2010

Я хочу переключить значение для isFollowing. Если это правда, я хочу isFollowing = false и наоборот.

Вместо оператора if, который я использую? :

        isFollowing == true ? isFollowing = false : isFollowing = true;

Но это не работает. он дает «Только операторы присваивания, вызова, приращения, декремента и нового выражения объекта могут использоваться как оператор» Почему это?

Заранее спасибо

Ответы [ 4 ]

16 голосов
/ 11 января 2010

Если вы хотите сохранить его как троицу, вы можете сделать

isFollowing = (isFollowing == true ? false : true);

Однако это гораздо более короткий эквивалент:

isFollowing = !isFollowing;

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

Ваш код, скорее всего, будет действителен в C, если он удовлетворяет правилам приоритета операторов, но C # не позволит вам сделать это. На практике лучше всего ограничить свои троичные ветви тем, что они не будут иметь побочных эффектов, даже если язык позволяет вам это делать.

10 голосов
/ 11 января 2010

Использование:

isFollowing = !isFollowing;

Чтобы сделать это с помощью троичного оператора:

isFollowing = isFollowing ? false : true;

Но не делайте этого, просто используйте первую версию.

Причина того, что у вас не работает, заключается в том, что троичный оператор имеет форму

conditon ? expression_if_condition_is_true : expression_if_condition_is_false;

, и это приводит к выражению (expression_if_condition_is_true, если condition равно true и expression_if_condition_is_false если condition равно false).Выражения нельзя использовать как операторы, если они не являются вызовами методов, приращениями (то есть i++), приращениями, распределениями с использованием new и присваиваниями.

1 голос
/ 11 января 2010

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

isFollowing == true ? isFollowing = false : isFollowing = true;
                                  ^
                                here

Тернарный оператор является выражением, и вы не можете иметь этот тип выражения самостоятельно, вам нужно присвоить его чему-либо.

Другие ответы здесь дают вам решение о том, как переписать его:

isFollowing = !isFollowing;
1 голос
/ 11 января 2010

Конечно, более простой способ:

isFollowing = !isFollowing;

В противном случае используйте?:

isFollowing = isFollowing ? false : true;
...