Вызов метода с использованием тернарного оператора
Во время игры с новыми концепциями я наткнулся на Ternary Operator
и красоту. Поиграв с ним какое-то время, я решил проверить его пределы.
Однако моя забава закончилась быстро, когда я не смог получить определенную строку кода для компиляции.
int a = 5;
int b = 10;
a == b ? doThis() : doThat()
private void doThis()
{
MessageBox.Show("Did this");
}
private void doThat()
{
MessageBox.Show("Did that");
}
Эта строка дает мне две ошибки:
Error 1 Only assignment, call, increment, decrement, and new object expressions can be used as a statement
Error 2 Type of conditional expression cannot be determined because there is no implicit conversion between 'void' and 'void'
Я никогда не использовал Ternary Operator
, чтобы решить, какой метод вызывать, и не знаю, возможно ли это. Мне просто нравится идея однострочного If Else Statement
для вызова метода.
Я провел немного исследований, и я не могу найти примеров того, кто делает это, поэтому я думаю, что могу надеяться на то, что не может обеспечить.
Если это возможно, пожалуйста, просветите меня в моих неправильных действиях, и это невозможно, есть ли другой способ?
Ответы
Ответ 1
Причина, по которой вышеуказанный оператор не работает, был предоставлен другими пользователями и фактически не ответил на мой истинный вопрос.
Поиграв еще немного, я понял, что вы можете использовать этот оператор для выполнения вышеуказанного утверждения, но это приводит к некорректному коду.
Если бы я изменил приведенный выше оператор:
int a = 5;
int b = 10;
int result = a == b ? doThis() : doThat();
private int doThis()
{
MessageBox.Show("Did this");
return 0;
}
private int doThat()
{
MessageBox.Show("Did that");
return 1;
}
Этот код будет компилироваться и выполнять так, как он должен. Однако, если эти методы изначально не предназначались для возврата чего-либо и ссылались на другие области кода, теперь вы должны обрабатывать возвращаемый объект каждый раз, чтобы вызывать эти методы.
В противном случае теперь вы можете использовать тернарный оператор для однострочного метода выбора и даже знать, какой метод он вызвал в следующей строке, используя результат.
int result = a == b ? doThis() : doThat();
if (result == 0)
MessageBox.Show("You called doThis()!");
Теперь этот код абсолютно бессмыслен и может быть легко выполнен с помощью If If Else, но я просто хотел узнать, можно ли это сделать, и что вам нужно сделать, чтобы заставить его работать.
Теперь, когда я знаю, что вы можете эффективно возвращать любой тип в этих методах, это может стать немного более полезным. Его можно рассматривать как "Практику плохого кодирования", но он может стать очень полезным в ситуациях, в которых он никогда не был МОНОМ.
Вы можете получить доступ к одному объекту или другому на основе любого условия, и это может быть очень полезно в одной строке кода.
UserPrivileges result = user.Group == Group.Admin ? GiveAdminPrivileges() : GiveUserPrivileges();
private UserPrivileges GiveAdminPrivileges()
{
//Enter code here
return var;
}
private UserPrivileges GiveUserPrivileges()
{
//Enter code here
return var;
}
Конечно, это можно сделать с помощью инструкции If, но я думаю, что использование Тернарного оператора для других целей делает программирование забавным. Теперь это может быть не так эффективно, как оператор If Else, и в этом случае я бы никогда не использовал его.
Ответ 2
тернарный оператор используется для возврата значений, и эти значения должны быть назначены. Предполагая, что методы doThis()
и doThat()
возвращают значения, простое задание исправит вашу проблему.
Если вы хотите делать то, что вы пытаетесь, это возможно, но решение не очень красивое.
int a = 5;
int b = 10;
(a == b ? (Action)doThis : doThat)();
Это возвращает делегат Action, который затем вызывается скобкой. Это не типичный способ достижения этого.
Ответ 3
Тернарный оператор должен что-то вернуть. Типичное использование выглядит так:
int x = (a > b) ? a : b;
Если вы попробуете что-то вроде
a + b;
Компилятор будет жаловаться.
(a > b) ? a - b : b - a;
в основном является ярлыком для "a-b" или "b-a", которые сами по себе не являются законными.
Ответ 4
Если вы действительно хотите вызвать методы void
в условном операторе, вы можете использовать делегаты:
(something ? new Action(DoThis) : DoThat)();
Если методы принимают параметры, это будет усложняться.
Вы можете либо поставить лямбда-выражения в условное выражение, либо использовать Action<T>
.
Однако это очень глупая вещь.
Ответ 5
Вы должны быть в состоянии сделать это, хотя:
int a = 5;
int b = 10;
var func = a == b ? (Action)doThis : (Action)doThat; // decide which method
func(); // call it
Не то чтобы это действительно так полезно, хотя.
Ответ 6
Условный оператор - это выражение, которое возвращает значение.
Вы не можете использовать его с функциями, возвращающими void
.
Вместо этого вы должны использовать обычный if
.
Ответ 7
.NET не поддерживает (легко) поддержку (читаемую версию) по этой причине. Это очень жуткий и делает ваш код трудным для чтения. Логические деревья должны быть относительно легко перемещаться. Если бы я должен был зайти на работу и весь код, который они использовали тройной для назначения значений, методов вызова и т.д. Я думаю, что я просто уйду.