为什么这不编译?

New*_*ian 2 c# generics polymorphism inheritance

来自Java或Python我习惯于制作这样的结构,通常它"只是工作".最近发现了C#,除了一些挫折之外,发现它很愉快.

令人沮丧的是,我必须通过多态构造(覆盖,虚拟等)来掌握它.

这是一个我还没有找到如何"只是做工"的案例.

class Polymorphism
{
    public interface IPerson
    {
        String Name { get; set; }
    }

    public class Doctor : IPerson
    {
        public String Name { get; set; }
    }

    public class DoctorGroup
    {
        public IEnumerable<IPerson> Members
        {
            get
            {
                return DoctorMembers;
            }
        }

        public List<Doctor> DoctorMembers { get; set; }
        public DoctorGroup()
        {
            DoctorMembers = new List<Doctor>();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这里DoctorMembersIPersonS,所以当记者问一个我应该能够仅仅返回医生的名单IEnumerableIPerson.

public IEnumerable<IPerson> Members
{
    get
    {
        return DoctorMembers;
    }
}
Run Code Online (Sandbox Code Playgroud)

然而......编译器抱怨......为什么?我错过了什么?从语义上讲,这没有任何问题,到目前为止我使用的大多数OOP语言都可以在没有语法Pepto-Bismol的情况下消化它.我错过了一个关键字,使编译器显而易见吗?

这里明显的捷径是LINQ转换所有医生,IPerson但我不明白为什么这是必要的甚至是可取的.

有人可以点亮我的灯笼吗?

Jon*_*eet 10

此代码不会与C#4针对.NET 4编译,但不会在C#3,它不具有编译通用的差异.

基本上你想要隐式转换IEnumerable<Doctor>IEnumerable<IPerson>.这是安全的,因为你只能得到一个"超出"的值IEnumerable<T>...这就是为什么在.NET 4中,它被声明为IEnumerable<out T>.

有关详细信息,请阅读有关泛型差异的更多信息,并记住这仅适用于C#4及更高版本.

(如果必须使用C#3或.NET 3.5,则可以使用CSharpie显示的解决方案......但理想情况下,升级到更新的版本:)