我已经听到/阅读了很多关于 C# 中的协方差问题的内容,我想提出一些问题和场景,希望我能澄清我对此事的困惑。
在这些示例中,请假设始终定义以下内容:
public class Apple : Fruit {}
我的第一个例子:
IList<Apple> apples = GetApples();
IList<Fruit> fruits = apples;
这应该有效,对吗?我在 C# 中对此进行了几次测试,它编译得很好并且运行良好(我对第一个示例的测试比这略多,因为我有将内容打印到控制台的多态调用)。
第二个例子:
IList<Apple> apples = GetApples();
IList<object> fruits = apples;
在第二个示例中,我的理解是这不应该编译,并且是 .NET 4.0 中解决的协方差问题的根源。如果我错了,请纠正我。我也知道.NET 4.0 不允许具体类型之间的协变/逆变,只有接口。
最后,我想得到一些定义。我不太清楚这三个术语背后的含义:
- 协方差
- 逆变
- 不变性(与不变性相同?)
至于最后一个词,我在 C++ 中经常使用它来指代隐含规则的更改。例如,如果我有一个整数并且它只允许有 1 到 10 之间的值,那么“不变性”就是它只能在 1 到 10 之间。我可能会误解这一点,我也不确定是否对于此特定讨论,此定义很好地转换为 C#。
编辑
我的目标是准确了解 C# 中泛型接口的协方差或转换问题。我发布的示例是我对问题所在的理解。如果所有示例都编译/运行良好,请提供一个示例,该示例确实重现了 C# 中最常见的协变/逆变/转换问题。我需要知道这一点,以便我可以识别并向其他人解释问题。