É possível declarar uma função lambda e chamá-la imediatamente:
Func<int, int> lambda = (input) => { return 1; };
int output = lambda(0);
Gostaria de saber se é possível fazê-lo em uma linha, por exemplo, algo como
int output = (input) => { return 1; }(0);
que fornece um erro do compilador "Nome do método esperado". A transmissão para Func<int, int>também não funciona:
int output = (Func<int, int>)((input) => { return 1; })(0);
dá o mesmo erro e, pelos motivos mencionados abaixo, gostaria de evitar precisar especificar explicitamente o tipo de argumento de entrada (o primeiro int).
Você provavelmente está se perguntando por que eu quero fazer isso, em vez de apenas incorporar o código diretamente, por exemplo int output = 1;. O motivo é o seguinte: Gerei uma referência para um serviço da web SOAP com o svcutilqual, por causa dos elementos aninhados, gera nomes de classe extremamente longos, que eu gostaria de evitar de digitar. Então, ao invés de
var o = await client.GetOrderAsync(request);
return new Order {
OrderDate = o.OrderDate,
...
Shipments = o.Shipment_Order == null ? new Shipment[0]
o.Shipment_Order.Select(sh => new Shipment {
ShipmentID = sh.ShipmentID,
...
Address = CreateAddress(sh.ReceiverAddress_Shipment);
}).ToArray()
};
e um CreateAddress(GetOrderResultOrderShipment_OrderShipmentShipment_Address address)método separado (nomes reais são ainda maiores e eu tenho um controle muito limitado sobre o formulário), gostaria de escrever
var o = await client.GetOrderAsync(request);
return new Order {
OrderDate = o.OrderDate,
...
Shipments = o.Shipment_Order == null ? new Shipment[0]
o.Shipment_Order.Select(sh => new Shipment {
ShipmentID = sh.ShipmentID,
...
Address = sh.ReceiverAddress_Shipment == null ? null : () => {
var a = sh.ReceiverAddress_Shipment.Address;
return new Address {
Street = a.Street
...
};
}()
}).ToArray()
};
Eu sei que eu poderia escrever
Address = sh.ReceiverAddress_Shipment == null ? null : new Address {
Street = sh.ReceiverAddress_Shipment.Address.Street,
...
}
mas mesmo isso (a sh.ReceiverAddress_Shipment.Addressparte) se torna muito repetitivo se houver muitos campos. Declarar um lambda e chamá-lo imediatamente seria mais elegante, menos caracteres para escrever.
public T Exec<T>(Func<T> func) => return func();e usá-lo assim: int x = Exec(() => { return 1; });isso para mim é muito melhor do que o elenco com todas as suas características.
int output = ((Func<int>) (() => { return 1; }))();