ラムダ関数を宣言してすぐに呼び出すことが可能です。
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
部分)でさえ、多くのフィールドがある場合、非常に繰り返しになります。ラムダを宣言し、すぐにそれは次のようになり呼び出すよりエレガントな書き込みが少ない文字。
public T Exec<T>(Func<T> func) => return func();
、次のように使用int x = Exec(() => { return 1; });
してください。
int output = ((Func<int>) (() => { return 1; }))();