ฉันไม่เข้าใจว่าทำไมโค้ด C # ต่อไปนี้ไม่คอมไพล์
อย่างที่คุณเห็นฉันมีวิธีการทั่วไปแบบคงที่ Something ที่มีIEnumerable<T>พารามิเตอร์ (และTถูก จำกัด ให้เป็นIAอินเทอร์เฟซ) และพารามิเตอร์นี้ไม่สามารถแปลงเป็นIEnumerable<IA>ไฟล์.
มีคำอธิบายอย่างไร? (ฉันไม่ได้ค้นหาวิธีแก้ปัญหาเพียงเพื่อทำความเข้าใจว่าเหตุใดจึงไม่ได้ผล)
public interface IA { }
public interface IB : IA { }
public class CIA : IA { }
public class CIAD : CIA { }
public class CIB : IB { }
public class CIBD : CIB { }
public static class Test
{
public static IList<T> Something<T>(IEnumerable<T> foo) where T : IA
{
var bar = foo.ToList();
// All those calls are legal
Something2(new List<IA>());
Something2(new List<IB>());
Something2(new List<CIA>());
Something2(new List<CIAD>());
Something2(new List<CIB>());
Something2(new List<CIBD>());
Something2(bar.Cast<IA>());
// This call is illegal
Something2(bar);
return bar;
}
private static void Something2(IEnumerable<IA> foo)
{
}
}
เกิดข้อผิดพลาดฉันเข้าSomething2(bar)แถว:
อาร์กิวเมนต์ 1: ไม่สามารถแปลงจาก 'System.Collections.Generic.List' เป็น 'System.Collections.Generic.IEnumerable'
Tประเภทการอ้างอิง หากคุณใช้เงื่อนไขwhere T: class, IAแล้วควรใช้งานได้ คำตอบที่เชื่อมโยงมีรายละเอียดเพิ่มเติม
Something2(foo);ตรงๆ การไปรอบ ๆ.ToList()เพื่อรับList<T>( Tคือพารามิเตอร์ประเภทของคุณที่ประกาศโดยวิธีการทั่วไป) ไม่จำเป็นต้องเข้าใจสิ่งนี้ (a List<T>คือ an IEnumerable<T>)