IEnumerable<T>
เป็นตัวแปรร่วมแต่ไม่สนับสนุนประเภทค่าเพียงแค่ประเภทอ้างอิงเท่านั้น คอมไพล์รหัสด้านล่างเรียบง่ายสำเร็จแล้ว:
IEnumerable<string> strList = new List<string>();
IEnumerable<object> objList = strList;
แต่การเปลี่ยนจากstring
เป็นint
จะได้รับการรวบรวมข้อผิดพลาด:
IEnumerable<int> intList = new List<int>();
IEnumerable<object> objList = intList;
เหตุผลอธิบายไว้ในMSDN :
ความแปรปรวนใช้กับประเภทอ้างอิงเท่านั้น หากคุณระบุประเภทค่าสำหรับพารามิเตอร์ประเภทตัวแปรพารามิเตอร์ประเภทนั้นจะไม่เปลี่ยนแปลงสำหรับชนิดที่สร้างขึ้นที่เกิดขึ้น
ฉันค้นหาและพบว่าบางคำถามที่กล่าวถึงเหตุผลคือการชกมวยระหว่างประเภทค่าและประเภทการอ้างอิงมวยระหว่างชนิดของมูลค่าและประเภทของการอ้างอิงแต่มันยังไม่ชัดเจนในใจฉันมากนักว่าทำไมการชกมวยถึงเป็นเหตุผล?
ใครช่วยกรุณาให้คำอธิบายที่เรียบง่ายและมีรายละเอียดว่าทำไมความแปรปรวนร่วมและความแตกต่างไม่สนับสนุนประเภทของค่าและการชกมวยมีผลต่อเรื่องนี้อย่างไร?