Можна оголосити лямбда-функцію і негайно викликати її:
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частина) стає дуже повторюваним, якщо є багато полів. Оголосити лямбду і негайно назвати її було б більш елегантно, щоб писати менше символів.
public T Exec<T>(Func<T> func) => return func();і використати її так: int x = Exec(() => { return 1; });Це для мене читається набагато приємніше, ніж кастинг з усіма його паренами.
int output = ((Func<int>) (() => { return 1; }))();