Mungkin untuk mendeklarasikan fungsi lambda dan segera menyebutnya:
Func<int, int> lambda = (input) => { return 1; };
int output = lambda(0);
Saya bertanya-tanya apakah mungkin untuk melakukannya dalam satu baris, misalnya sesuatu seperti
int output = (input) => { return 1; }(0);
yang memberikan kesalahan kompilator "Nama metode yang diharapkan". Casting untuk Func<int, int>
tidak bekerja:
int output = (Func<int, int>)((input) => { return 1; })(0);
memberikan kesalahan yang sama, dan untuk alasan yang disebutkan di bawah ini saya ingin menghindari keharusan untuk secara eksplisit menentukan jenis argumen input (yang pertama int
).
Anda mungkin bertanya - tanya mengapa saya ingin melakukan ini, daripada hanya menyematkan kode secara langsung, misalnya int output = 1;
. Alasannya adalah sebagai berikut: Saya telah membuat referensi untuk layanan web dengan SOAP svcutil
, yang karena elemen bersarang menghasilkan nama kelas yang sangat panjang, yang saya ingin hindari mengetik. Jadi, bukannya
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()
};
dan CreateAddress(GetOrderResultOrderShipment_OrderShipmentShipment_Address address)
metode yang terpisah (nama asli bahkan lebih lama, dan saya memiliki kontrol yang sangat terbatas tentang formulir), saya ingin menulis
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()
};
Saya tahu saya bisa menulis
Address = sh.ReceiverAddress_Shipment == null ? null : new Address {
Street = sh.ReceiverAddress_Shipment.Address.Street,
...
}
tetapi bahkan itu ( sh.ReceiverAddress_Shipment.Address
bagian) menjadi sangat berulang jika ada banyak bidang. Mendeklarasikan lambda dan segera menyebutnya akan lebih elegan untuk menulis karakter.
public T Exec<T>(Func<T> func) => return func();
dan gunakan seperti ini: int x = Exec(() => { return 1; });
Bagi saya itu jauh lebih bagus daripada casting dengan semua parensnya.
int output = ((Func<int>) (() => { return 1; }))();