我想可以将IList<ChildClass>作为IEnumerable<ParentClass>传递,因为显然ChildType列表中的每个对象也是ParentType的实例。但是我不会从编译器那里得到爱。我想念什么?

编辑:添加了功能Foo3,它可以执行我想要的操作。谢谢!

namespace StackOverflow
{
    public class ParentClass
    {
    }

    public class ChildClass : ParentClass
    {
    }

    public class Test
    {
        // works
        static void Foo(ParentClass bar2)
        {
        }

        // fails
        static void Foo2(IEnumerable<ParentClass> bar)
        {
        }

        // EDIT: here's the right answer, obtained from the
        // Charlie Calvert blog post
        static void Foo3<T>(IEnumerable<T> bar) where T : ParentClass
        {
        }

        public static void Main()
        {
            var childClassList = new List<ChildClass>();

            // this works as expected
            foreach (var obj in childClassList)
                Foo(obj);

            // this won't compile
            // Argument '1': cannot convert from
            // 'System.Collections.Generic.List<ChildClass>'
            // to 'System.Collections.Generic.IEnumerable<ParentClass>'
            Foo2(childClassList);

            // EDIT: this works and is what I wanted
            Foo3(childClassList);
        }
    }
}

最佳答案

因为泛型不是co / contra变体:

Eric Lippert's blog在这方面有很好的文章。

Charlie Calvert is here的另一篇文章。

09-30 00:09