Вопрос

В c# могу ли я сделать что-то подобное в сокращенном виде?

 bool validName = true;
 if (validName)
 {
     name = "Daniel";
     surname = "Smith";
 }
 else
 {
     MessageBox.Show("Invalid name");
 }

Мне просто было интересно, сработает ли что-то подобное этому, но именно в этом сценарии, я знаю, вы можете присваивать значения, если я сделал name = validName ?"Дэниел" :"Недействительно", но мне просто было интересно, могу ли я сделать нижеприведенное?

     validName ? 
     {
         name = "Daniel";
         surname = "Smith";
     } 
     : 
     {
         MessageBox.Show("Invalid name");
     }
Это было полезно?

Решение

Злоупотребление лямбда-синтаксисом и выводом типов:

(validName
    ? (Action)
        (() =>
            {
                name = "Daniel";
                surname = "Smith";
            })
      : () =>
           {
                MessageBox.Show("Invalid name");
           })();

Я знаю, на самом деле это не ответ.Утверждение If намного лучше:очевидно, что этот синтаксис менее удобочитаем и, что более важно, он имеет другое поведение во время выполнения и может привести к непреднамеренным побочным эффектам из-за потенциальных замыканий, создаваемых лямбда-выражениями.

Синтаксис тоже немного загадочен.Сначала он создает два Action объекты, тогда ?: оператор выбирает между ними, и, наконец, выполняется выбранный результат:

var a1 = new Action(() => { /* if code block */ });
var a2 = new Action(() => { /* else code block */ });

Action resultingAction = test_variable ? a1 : a2;

resultingAction();

Я объединил это в одном заявлении, выполнив результирующее действие на месте.Чтобы сделать его еще более кратким, я преобразовал первое лямбда-выражение в Action (вместо того, чтобы создавать new Action() явно) и, воспользовавшись преимуществом вывода типа, я опустил второе приведение.

Другие советы

Допустим, вы могли бы сделать это.Почему?

Что такое мотивация?

Меньше строк?недостаточно, чтобы иметь значение. Представление?Нет, компилятор будет справиться с тобой для вас. Ясность?Если / иначе понятнее и легче понимать большинство разработчиков.

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

нет.

Темнарный оператор (? :) Должно быть, в целом выражение - то есть то, что можно назначить на что-то.

Условный оператор требует, чтобы его второе и третий операнды должны быть выражениями, которые возвращают значение (в дополнение к удовлетворению некоторых типовых ограничений), а не операторы, которые не решают значение.Вы не имеете значения, которые вы хотите вернуться с любой операции, вы в настоящее время выполняете.

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

fullName = validName == true ? returnName(firstName)+" "+returnName(lastName) : validName == false ? invalidName("Invalid Name") : null


public string returnName(string name)
{
return name;
}

public string invalidName(string invalid)
{
MessageBox.Show(invalid);
return null;
}
.

Как все остальные, вероятно, сказали, что это то, что вы, вероятно, не захотите делать, но можно: P

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top