سؤال

كيف يمكنني عمل التعليمة البرمجية التالية؟ لا أعتقد أنني أفهم تماما C #. ربما، يمكن لشخص ما توجيه لي في الاتجاه الصحيح.

    public abstract class A
    {
    }

    public class B : A
    {
    }

    public class C : A
    {
    }

    public static List<C> GetCList()
    {
        return new List<C>();
    }

    static void Main(string[] args)
    {
        List<A> listA = new List<A>();

        listA.Add(new B());
        listA.Add(new C());

        // Compiler cannot implicitly convert
        List<A> listB = new List<B>();

        // Compiler cannot implicitly convert
        List<A> listC = GetCList();

        // However, copying each element is fine
        // It has something to do with generics (I think)
        List<B> listD = new List<B>();
        foreach (B b in listD)
        {
            listB.Add(b);
        }
    }

ربما إجابة بسيطة.

تحديث: أولا، هذا غير ممكن في C # 3.0، ولكن سيكون ممكنا في C # 4.0.

للحصول عليه تشغيله في C # 3.0، وهو مجرد حل واحد حتى 4.0، استخدم ما يلي:

        // Compiler is happy
        List<A> listB = new List<B>().OfType<A>().ToList();

        // Compiler is happy
        List<A> listC = GetCList().OfType<A>().ToList();
هل كانت مفيدة؟

المحلول

يمكنك دائما القيام بذلك

List<A> testme = new List<B>().OfType<A>().ToList();

كما أشار "bojan resnik"، يمكنك أيضا القيام ...

List<A> testme = new List<B>().Cast<A>().ToList();

الفرق في ملاحظة هو أن يلقيu003CT> () سوف تفشل إذا لم يتطابق أحد أو أكثر من الأنواع. حيث oftype.u003CT> () سوف تعيد ienumerableu003CT> تحتوي فقط على الكائنات المكشوفة

نصائح أخرى

السبب في أن هذا لا يعمل لأنه لا يمكن تحديده ليكون آمنا. لنفترض أن لديك

List<Giraffe> giraffes = new List<Giraffe>();
List<Animal> animals = giraffes; // suppose this were legal.
// animals is now a reference to a list of giraffes, 
// but the type system doesn't know that.
// You can put a turtle into a list of animals...
animals.Add(new Turtle());  

ومهلا، لقد وضعت فقط سلحفاة في قائمة الزرافات، وقد انتهكت سلامة نظام النوع الآن. لهذا السبب هذا غير قانوني.

المفتاح هنا هو أن "الحيوانات" و "الزرافات" الرجوع إلى نفس الكائن، وهذا الكائن هو قائمة الزرافات. لكن قائمة الزرافات لا تستطيع أن تفعل ما يمكن أن تفعل قائمة بالحيوانات؛ على وجه الخصوص، لا يمكن أن تحتوي على سلحفاة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top