Intereting Posts

C # Условный оператор – не заявление?

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

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

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

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

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

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

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

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

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

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

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

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

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

Вы не устанавливаете значение результата тройной ни в чем, поэтому.

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

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

 "something that is not a statement"; 

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

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

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

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

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

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

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

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

1 + 1 ;

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

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

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

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

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

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

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