Подтвердить что ты не робот

С# Условный оператор - не выражение?

У меня есть простой фрагмент кода, который меня разочаровывает:

HashSet<long> groupUIDs = new HashSet<long>();
groupUIDs.Add(uid)? unique++ : dupes++;

Во время компиляции он генерирует ошибку:

В качестве оператора

можно использовать только присвоение, вызов, приращение, декремент и новые объектные выражения.

HashSet.Add задокументирован, чтобы вернуть bool, поэтому должен работать троичный оператор (?), и это выглядит как вполне законный способ отслеживать количество уникальных и повторяющихся элементов, которые я добавляю в хэш-набор.

Когда я переформатирую его как if-then-else, он отлично работает.

Может кто-нибудь объяснить ошибку, и если есть способ сделать это как простой тернарный оператор?

4b9b3361

Ответ 1

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

int dummy = groupUIDs.Add(uid)? unique++ : dupes++;

Говоря, я бы рекомендовал просто использовать if-then-else. Это менее запутанно, потому что это не связано с созданием "волшебных" фиктивных переменных...

Ответ 2

Как указывали другие, условный оператор не является выражением юридического утверждения. (Выражения юридического оператора - это назначения, вызовы, приращения, декременты и конструкции.)

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

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

Ответ 3

Вы не устанавливаете значение результата тройного кода для чего-либо, почему.

HashSet<long> groupUIDs = new HashSet<long>();
int count = groupUIDs.Add(uid)? unique++ : dupes++;

Ответ 4

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

"something that is not a statement";

Чтобы уточнить, вы должны вытащить тернарный оператор и использовать if.

Ответ 5

Компилятор не жалуется на Add, он жалуется на то, что ваше условное выражение не является полным выражением.

Некоторые языки (например, JavaScript) позволяют использовать условное выражение для логики ветвления, как это было сделано здесь, но для С# требуется присвоить переменную результат условного выражения. Как только вы назначаете результат выражения, вы сделали полный оператор, и компилятор счастлив.

Ответ 6

Вам нужно использовать значение от тернарного оператора для чего-то...

HashSet<long> groupUIDs = new HashSet<long>();
int newCount = groupUIDs.Add(uid)? unique++ : dupes++;

или - используйте if, если

HashSet<long> groupUIDs = new HashSet<long>();
if (groupUIDs.Add(uid))
   unique++;
else
   dupes++;

Ответ 7

gmcalab и sr pt являются правильными; тернарный оператор должен дать вам результат, точно так же, как 1 + 1 дает вам 2. Вы не могли просто написать:

1 + 1;

Путаница здесь (я думаю) заключается в том, что вы думаете о том, что трёхмерный оператор подобен функции.

Ответ 8

описание тройного оператора в справочнике по языку говорит, что

Если условие истинно, первое выражение оценивается и становится результатом; если false, второе выражение оценивается и становится результатом.

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

По-моему, повторная запись как if/else будет более понятной.

Ответ 9

Если это неприемлемо, зачем нужна ваша линия? Просто используйте оператор if: -)

        bool b = false;
        b?callB():callA();