gpt4 book ai didi

c# - 为什么这不能编译?

转载 作者:行者123 更新时间:2023-11-30 19:02:22 27 4
gpt4 key购买 nike

来自 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>();
}
}
}

这里的 DoctorMembersIPerson,因此当被要求提供 IEnumerable 时,我应该能够返回一个医生列表 IPerson

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

然而……编译器提示……为什么?我错过了什么?从语义上讲,这没有任何问题,到目前为止,我使用过的大多数 OOP 语言都可以在没有句法 Pepto-Bismol 的情况下消化它。我是否缺少关键字以使其对编译器显而易见?

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

谁能点亮我的灯笼?

最佳答案

此代码确实使用针对 .NET 4 的 C#4 进行编译,但不会在没有 generic variance 的 C#3 中进行编译。 .

基本上您需要从 IEnumerable<Doctor> 进行隐式转换至 IEnumerable<IPerson> .这很安全,因为您只能从 IEnumerable<T> 中获取值“out” ... 这就是为什么在 .NET 4 中,它被声明为 IEnumerable<out T> .

阅读更多关于泛型方差的详细信息,并记住这仅在 C# 4 及更高版本中可用。

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

关于c# - 为什么这不能编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13220827/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com