(Suponho que você esteja realmente falando sobre várias declarações em vez de várias linhas).
Você pode usar várias instruções em uma expressão lambda usando chaves, mas apenas a sintaxe que não usa chaves pode ser convertida em uma árvore de expressões:
// ValidFunc<int,int> a = x => x +1;Func<int,int> b = x =>{return x +1;};Expression<Func<int,int>> c = x => x +1;// InvalidExpression<Func<int,int>> d = x =>{return x +1;};
Estou tentando entender por que o Func permite chaves e a expressão não está permitindo. De qualquer forma, a expressão será compatível como Func. Existe alguma maneira de adicionar lógica de várias linhas à árvore de expressões? Se não, por que está restringindo isso?
Habeeb
8
@Habeeb: "De qualquer forma, a expressão será cumprida como Func" Nem sempre. Muitas vezes, nunca é compilado para um delegado - apenas examinado como dados. As árvores de expressão no .NET 4.0 ganharam a capacidade de incluir várias instruções via Expression.Block, mas a linguagem C # não suporta isso. Poderia, mas isso exigiria mais trabalho de design / implementação / teste.
precisa saber é o seguinte
26
Você pode colocar quantas linhas novas desejar em uma expressão lambda; C # ignora novas linhas.
Você provavelmente quis perguntar sobre várias declarações .
Várias instruções podem ser colocadas entre chaves.
Não seria mais preciso dizer que o C # trata todos os espaços em branco, incluindo novas linhas, igualmente? Parece um pouco enganador dizer que ignora as novas linhas - parece que as remove completamente e você pode dividir uma palavra-chave em uma nova linha ou algo assim.
Tesserex
6
Desde o C # 7:
Declaração de linha única:
int expr(int x,int y)=> x + y +1;
Declaração multilinha:
int expr(int x,int y){int z =8;return x + y + z +1;};
embora sejam chamadas de funções locais, acho que isso parece um pouco mais limpo que o seguinte e é efetivamente o mesmo
Func<int,int,int> a =(x, y)=> x + y +1;Func<int,int,int> b =(x, y)=>{int z =8;return x + y + z +1;};
O Polity está demonstrando o formato de várias linhas solicitado pela pergunta, não recebendo sugestões de golfe. Implementar seu código inteligente tornaria "não uma resposta"!
Action<int,int> action =(x, y)=>{ X += x; Y += y;};
Isso também pode ser útil se você precisar escrever o método ou construtor regular em uma linha ou quando precisar de mais de uma instrução / expressão para ser compactada em uma expressão:
publicvoidAction(int x,int y)=>(_, _)=(X += x, Y += y);
ou
publicvoidAction(int x,int y)=> _ =(X += x, Y += y);
ou
publicvoidAction(int x,int y)=>(X, Y)=(X + x, Y + y);
Respostas:
Certo:
fonte
(Suponho que você esteja realmente falando sobre várias declarações em vez de várias linhas).
Você pode usar várias instruções em uma expressão lambda usando chaves, mas apenas a sintaxe que não usa chaves pode ser convertida em uma árvore de expressões:
fonte
Você pode colocar quantas linhas novas desejar em uma expressão lambda; C # ignora novas linhas.
Você provavelmente quis perguntar sobre várias declarações .
Várias instruções podem ser colocadas entre chaves.
Veja a documentação .
fonte
Desde o C # 7:
Declaração de linha única:
Declaração multilinha:
embora sejam chamadas de funções locais, acho que isso parece um pouco mais limpo que o seguinte e é efetivamente o mesmo
fonte
fonte
Nas expressões Lambda (Guia de Programação em C #) :
fonte
Com o c # 7.0, você pode usar assim também
fonte
Digamos que você tenha uma aula:
Com o C # 7.0 dentro dessa classe, você pode fazer isso mesmo sem colchetes:
e
seria o mesmo que:
Isso também pode ser útil se você precisar escrever o método ou construtor regular em uma linha ou quando precisar de mais de uma instrução / expressão para ser compactada em uma expressão:
ou
ou
Mais sobre a desconstrução de tuplas na documentação .
fonte