Можно объявить лямбда-функцию и немедленно вызвать ее:
Func<int, int> lambda = (input) => { return 1; };
int output = lambda(0);
Мне интересно, возможно ли это сделать в одной строке, например, что-то вроде
int output = (input) => { return 1; }(0);
что выдает ошибку компилятора "Ожидается имя метода". Приведение к Func<int, int>
также не работает:
int output = (Func<int, int>)((input) => { return 1; })(0);
выдает ту же ошибку, и по причинам, указанным ниже, я бы хотел избежать необходимости явно указывать тип входного аргумента (первый int
).
Вы, вероятно, задаетесь вопросом , почему Я хочу сделать это, а не просто встраивать код напрямую, например int output = 1;
. Причина в следующем: я сгенерировал ссылку на SOAP веб-сервис с svcutil
, который из-за вложенных элементов генерирует очень длинные имена классов, которые я хотел бы избежать при наборе. Поэтому вместо
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()
};
и отдельного метода CreateAddress(GetOrderResultOrderShipment_OrderShipmentShipment_Address address)
(реальные имена еще длиннее, и я очень ограничен в управлении формой), я хотел бы написать
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()
};
Я знаю, что мог бы написать
Address = sh.ReceiverAddress_Shipment == null ? null : new Address {
Street = sh.ReceiverAddress_Shipment.Address.Street,
...
}
, но даже это (часть sh.ReceiverAddress_Shipment.Address
) становится очень повторяющимся, если есть много полей. Объявление лямбды и немедленный вызов будет на 1030 * более элегантным * на 1031 * меньше символов для записи.