เป็นไปได้ที่จะประกาศฟังก์ชั่นแลมบ์ดาและเรียกมันว่า:
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; });
สำหรับฉันแล้วฉันอ่านได้ดีกว่าการหล่อด้วย parens ทั้งหมด
int output = ((Func<int>) (() => { return 1; }))();