可以声明一个lambda函数并立即调用它:
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 Web服务的引用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
如果有很多字段,那么即使是那部分也变得非常重复。声明一个lambda并立即调用它会更加优雅,减少编写字符。
public T Exec<T>(Func<T> func) => return func();
并像这样使用它:int x = Exec(() => { return 1; });
对我来说,这比带有所有括号的转换更好。
int output = ((Func<int>) (() => { return 1; }))();