คนอื่น ๆ ได้ชี้ให้เห็นแล้วว่ามีประเภทตัวแทนที่เป็นไปได้มากมายซึ่งคุณอาจหมายถึง สิ่งที่เป็นเรื่องเกี่ยวกับพิเศษเพื่อFunc
ว่ามันสมควรที่จะเริ่มต้นแทนPredicate
หรือAction
หรือความเป็นไปได้อื่น ๆ ? และสำหรับลูกแกะทำไมเห็นได้ชัดว่าความตั้งใจที่จะเลือกรูปแบบตัวแทนมากกว่ารูปแบบต้นไม้แสดงออก?
แต่เราสามารถพูดได้ว่าFunc
เป็นสิ่งพิเศษและประเภทแลมบ์ดาหรือวิธีที่ไม่ระบุชื่อที่อนุมานได้คือ Func ของบางสิ่ง เรายังคงมีปัญหาทุกประเภท คุณต้องการสรุปประเภทใดสำหรับกรณีต่อไปนี้
var x1 = (ref int y)=>123;
ไม่มีFunc<T>
ประเภทที่จะอ้างอิงอะไร
var x2 = y=>123;
เราไม่ทราบประเภทของพารามิเตอร์ที่เป็นทางการแม้ว่าเราจะทราบถึงการคืนสินค้า (หรือเราหรือไม่ผลตอบแทน int หรือไม่สั้นสั้นหรือไม่ไบต์)
var x3 = (int y)=>null;
เราไม่ทราบประเภทการคืนสินค้า แต่ไม่สามารถถือเป็นโมฆะได้ ชนิดส่งคืนอาจเป็นชนิดการอ้างอิงหรือชนิดค่า nullable ใด ๆ
var x4 = (int y)=>{ throw new Exception(); }
อีกครั้งเราไม่ทราบประเภทการคืนสินค้าและคราวนี้มันอาจเป็นโมฆะ
var x5 = (int y)=> q += y;
นั่นเป็นเจตนาที่จะเป็นโมฆะ - กลับคำสั่งแลมบ์ดาหรือสิ่งที่ส่งกลับค่าที่ได้รับมอบหมายให้ q? ทั้งสองถูกกฎหมาย ซึ่งเราควรเลือก
ทีนี้คุณอาจพูดว่าไม่สนับสนุนคุณสมบัติเหล่านั้นเลย เพียงแค่รองรับกรณี "ปกติ" ที่ประเภทสามารถทำงานได้ นั่นไม่ได้ช่วยอะไร นั่นทำให้ชีวิตฉันง่ายขึ้นได้อย่างไร หากคุณสมบัติใช้งานได้บางครั้งและล้มเหลวบางครั้งฉันก็ยังต้องเขียนรหัสเพื่อตรวจสอบสถานการณ์ความล้มเหลวเหล่านั้นทั้งหมดและให้ข้อความแสดงข้อผิดพลาดที่มีความหมายสำหรับแต่ละข้อ เรายังต้องระบุพฤติกรรมทั้งหมดนั้นบันทึกมันเขียนการทดสอบและอื่น ๆ นี่เป็นคุณสมบัติราคาแพงมากที่ช่วยให้ผู้ใช้สามารถบันทึกการกดแป้นพิมพ์ได้ครึ่งโหล เรามีวิธีที่ดีกว่าในการเพิ่มมูลค่าให้กับภาษามากกว่าการใช้เวลาทดสอบเคสสำหรับคุณลักษณะที่ใช้งานไม่ได้ครึ่งเวลาและไม่ได้ผลประโยชน์ใด ๆ ในกรณีที่ใช้งานได้ยาก
สถานการณ์ที่เป็นประโยชน์จริง ๆ คือ:
var xAnon = (int y)=>new { Y = y };
เพราะไม่มีประเภท "พูด" สำหรับสิ่งนั้น แต่เรามีปัญหานี้อยู่ตลอดเวลาและเราแค่ใช้การอนุมานประเภทเมธอดเพื่ออนุมานประเภท:
Func<A, R> WorkItOut<A, R>(Func<A, R> f) { return f; }
...
var xAnon = WorkItOut((int y)=>new { Y = y });
และตอนนี้การอนุมานประเภทเมธอดจะหาว่าประเภท func คืออะไร
Func<>
ยอมรับอาร์กิวเมนต์ได้สูงสุด 16 รายการ