ฉันไม่เข้าใจว่าทำไมโค้ด 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>
)