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

Вызов метода с использованием тернарного оператора

Во время игры с новыми концепциями я наткнулся на 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 для вызова метода.

Я провел немного исследований, и я не могу найти примеров того, кто делает это, поэтому я думаю, что могу надеяться на то, что не может обеспечить.

Если это возможно, пожалуйста, просветите меня в моих неправильных действиях, и это невозможно, есть ли другой способ?

4b9b3361

Ответ 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 не поддерживает (легко) поддержку (читаемую версию) по этой причине. Это очень жуткий и делает ваш код трудным для чтения. Логические деревья должны быть относительно легко перемещаться. Если бы я должен был зайти на работу и весь код, который они использовали тройной для назначения значений, методов вызова и т.д. Я думаю, что я просто уйду.