Pergunta

Em c # posso fazer algo assim de forma abreviada?

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

Eu só estava me perguntando se algo semelhante a isso funcionaria, mas neste cenário exato, sei que você pode atribuir valores se eu fizer name = validName ?"Daniel":"Não é válido", mas eu queria saber se posso fazer o seguinte?

     validName ? 
     {
         name = "Daniel";
         surname = "Smith";
     } 
     : 
     {
         MessageBox.Show("Invalid name");
     }
Foi útil?

Solução

Abusando da sintaxe lambda e da inferência de tipo:

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

Eu sei, não é realmente uma resposta.Se a declaração for muito melhor:obviamente, essa sintaxe é menos legível e, mais importante, tem um comportamento de tempo de execução diferente e pode levar a efeitos colaterais indesejados devido a possíveis fechamentos criados pelas expressões lambda.

A sintaxe também é um pouco enigmática.Ele primeiro cria dois Action objetos então ?: operador escolhe entre eles e por fim o resultado escolhido é executado:

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

Action resultingAction = test_variable ? a1 : a2;

resultingAction();

Eu reuni tudo em uma instrução executando a ação resultante no local.Para torná-lo ainda mais breve, transformei a primeira expressão lambda em um Action (em vez de criar um new Action() explicitamente) e aproveitando a inferência de tipo, deixei de fora a segunda conversão.

Outras dicas

Digamos que você pudesse fazer isso.Por que?

Qual é a motivação?

Menos linhas?não é suficiente para fazer a diferença.Desempenho?Nenhum, o compilador cuidará das coisas para você.Clareza?If/else é mais claro e mais facilmente compreendido pela maioria dos desenvolvedores.

Tenho certeza de que, se você trabalhasse duro o suficiente, poderia encontrar uma maneira de lidar com isso (provavelmente um erro), mas ainda não consigo determinar o porquê.

Não.

O operador ternário (?:) deve ser, como um todo, uma expressão – isto é, algo que pode ser atribuído a alguma coisa.

O operador condicional exige que seu segundo e terceiro operandos sejam expressões que retornem um valor (além de atender a algumas restrições de tipo) e não instruções que não resultem em um valor.Você não tem nenhum valor que deseja retornar de nenhuma das operações que está executando no momento.

Você poderia retornar algum valor sem sentido apenas para compilar o código, mas nesse ponto você estará adicionando muito mais trabalho do que apenas usar um if qual é o operador semântico correto para seus requisitos; portanto, embora seja tecnicamente possível, não é uma boa ideia.

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;
}

Como todo mundo provavelmente já disse, é algo que você provavelmente não vai querer fazer, mas é possível: P

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top