Почему ошибка в тернарном операторе C#?

189
20 октября 2018, 12:30

Следующая ошибка появляется при копилляции кода:

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

Код:

int result = 0;
int right, wrong = 0;
result == textBox1.Text.ToInt() ? right++ : wrong++;

Почему здесь ошибка? Хотя здесь всё отлично работает

if (result == textBox1.Text.ToInt())
   right++;
else
   wrong++;   

P.S. На расширение ToInt не смотрите это мой extension method

Answer 1

Тернарный оператор - это некое подобие функции, т.е он возвращает одно из двух значений.

Поясняю. Есть код:

var result = condition ? valueIfTrue : valueIfFalse;

По сути это эквивалентно следующему коду:

var result = GetValue(condition);
int GetValue(bool condition)
{
    if (condition)
        return valueIfTrue;
    else
        return valueIfFalse;
}
Answer 2

Выражение тернарный оператор НЕ является выражением присваивания, вызова, инкремента, декремента и создание нового объекта.

Поэтому и появляется данная ошибка.

Для решения, можно заменить данное выражение на if.

Answer 3
result == 

Вы делаете сравнение, а нужно присваивание:

result = textBox1.Text.ToInt() ? ++right : ++wrong;

Обратите еще внимание я использовал префиксный инкремент вместо постфиксного, иначе у вас получилось result = 0.

UPD: Если вам нужно провести какие-либо операции в зависимости от некоего условия- не надо использовать тернарный оператор, используйте простой if:

if (result == textBox1.Text.ToInt())
    right++;
else
    wrong++;

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

Условный оператор (?:), известный как тернарный условный оператор, возвращает одно из двух значений в зависимости от значения логического выражения. docs.microsoft.com

Answer 4

Справедливости ради, здесь можно и тернарный оператор пофиксить, но это лютейший говнокод :)

int result = 0;
int right = 0;
int wrong = 0;
int fixer = (result == textBox1.Text.ToInt()) ? right++ : wrong++;
READ ALSO
Организации “архитектуры” приложения WPF

Организации “архитектуры” приложения WPF

Имеется приложение WPF которое выполняет нехитрые манипуляции, далее возникла необходимость например работы с данными из сторонних источников...

144
Актуальность Unit Of Work и Репозиториев в ASP.NET Core 2

Актуальность Unit Of Work и Репозиториев в ASP.NET Core 2

Раньше, наNET Framework MVC 5, я использовал трёхуровневую архитектуру вместе с паттернами Unit Of Work и Репозиторием

172
Работа с хуком на мышь

Работа с хуком на мышь

Работаю с хуком SetWindowsHookEx на мышь WH_MOUSE_LL

163
Поиск строки strpos в цикле

Поиск строки strpos в цикле

Как сделать поиск чтоб при каждом проходе по сайту искал строку и выводил ответ

180