ความหลากหลายประเภททั่วไป

public class A {}

public class B : A {}

ตอนนี้วิธีที่ดีที่สุดในการทำงานนี้คืออะไร

List<A> a;
List<B> b = new List<B>();
a = b; // throw Cannot convert List<B> to List<A>

ขอบคุณ


person Proviste    schedule 06.03.2011    source แหล่งที่มา
comment
ดู: stackoverflow.com/questions/2184551/   -  person Daniel A. White    schedule 07.03.2011


คำตอบ (1)


ประเภท List<T> ไม่รองรับความแปรปรวนร่วม ดังนั้นคุณจึงไม่สามารถกำหนด List<B> ให้กับ List<A> โดยตรงได้ แม้ว่า B จะสามารถกำหนดให้กับ A ได้โดยตรงก็ตาม คุณจะต้องส่งผ่านรายการ b โดยแปลงและเพิ่มรายการลงในรายการ a ในขณะที่คุณดำเนินการ วิธีการ ConvertAll เป็นวิธีที่สะดวกในการดำเนินการดังนี้:

List<B> b = new List<B>();
// ...
List<A> a = b.ConvertAll(x => (A)x);
person LukeH    schedule 06.03.2011
comment
อะไรคือความแตกต่างระหว่างพฤติกรรมระหว่าง ConvertAll(x =› (A)x) และ Select(x =› (A)x) ? - person Proviste; 07.03.2011
comment
ConvertAll เป็นวิธีการอินสแตนซ์ในคลาส List<T> และสร้าง List<T> ใหม่จากรายการที่มีอยู่ Select เป็นวิธีการขยายที่ทำงานกับ IEnumerable<T> ใดๆ และสร้างลำดับ IEnumerable<T> ใหม่ การใช้ ConvertAll ควร เล็กน้อย เร็วกว่า Select เนื่องจากสามารถเพิ่มประสิทธิภาพบางอย่างได้ (เช่น สามารถจัดสรรอาร์เรย์เป้าหมายให้มีความยาวที่ถูกต้องตั้งแต่เริ่มต้น แทนที่จะต้องปรับขนาดได้ทันที และ มันสามารถเข้าถึงอาร์เรย์พื้นฐานของรายการแหล่งที่มาได้โดยตรง แทนที่จะต้องสร้างอินสแตนซ์และใช้วัตถุตัวแจงนับแยกต่างหาก) - person LukeH; 07.03.2011