Es ist möglich, eine Lambda-Funktion zu deklarieren und sofort aufzurufen:
Func<int, int> lambda = (input) => { return 1; };
int output = lambda(0);
Ich frage mich, ob es möglich ist, dies in einer Zeile zu tun, z
int output = (input) => { return 1; }(0);
Dies gibt einen Compilerfehler "Methodenname erwartet". Casting to Func<int, int>
funktioniert auch nicht:
int output = (Func<int, int>)((input) => { return 1; })(0);
gibt den gleichen Fehler aus, und aus den unten genannten Gründen möchte ich vermeiden, den Eingabeargumenttyp (den ersten int
) explizit angeben zu müssen .
Sie fragen sich wahrscheinlich, warum ich das tun möchte, anstatt nur den Code direkt einzubetten, z int output = 1;
. Der Grund ist folgender: Ich habe eine Referenz für einen SOAP-Webservice mit generiert svcutil
, der aufgrund der verschachtelten Elemente extrem lange Klassennamen generiert, die ich vermeiden möchte, eingeben zu müssen. Also statt
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()
};
und eine separate CreateAddress(GetOrderResultOrderShipment_OrderShipmentShipment_Address address)
Methode (echte Namen sind noch länger und ich habe nur sehr begrenzte Kontrolle über das Formular), möchte ich schreiben
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()
};
Ich weiß, ich könnte schreiben
Address = sh.ReceiverAddress_Shipment == null ? null : new Address {
Street = sh.ReceiverAddress_Shipment.Address.Street,
...
}
Aber selbst das (der sh.ReceiverAddress_Shipment.Address
Teil) wiederholt sich sehr, wenn es viele Felder gibt. Ein Lambda zu deklarieren und es sofort aufzurufen, wäre eleganter, weniger Zeichen zu schreiben.
public T Exec<T>(Func<T> func) => return func();
und ihn so verwenden: int x = Exec(() => { return 1; });
Das liest sich für mich viel schöner als das Casting mit all seinen Parens.
int output = ((Func<int>) (() => { return 1; }))();