我没有参加PDC 2008,但我听到一些消息称C#4.0被宣布支持Generic协方差和反差异。也就是说, List< string> 可以分配给 List< object> 。怎么会这样?

在Jon Skeet的书 C#in Depth 中,解释了为什么C#泛型不支持协方差和反方差。它主要用于编写安全代码。现在,C#4.0改为支持它们。它会带来混乱吗?

有人知道有关C#4.0的详细信息可以给出一些解释吗?

有帮助吗?

解决方案

只有安全方式支持差异 - 实际上,使用CLR已有的功能。因此,我在试图使用 List< Banana> 作为 List< Fruit> (或其他任何东西)的书中提供的示例仍然不起作用 - 但其他一些场景将会。

首先,它只支持接口和代理。

其次,它要求接口/委托的作者将类型参数装饰为中的(用于逆变)或 out (用于协方差)。最明显的例子是 IEnumerable< T> ,它只允许你取值“out”。它 - 它不会让你添加新的。这将成为 IEnumerable< out T> 。这根本不会损害类型安全,但允许您从声明为返回 IEnumerable< object> 的方法返回 IEnumerable< string>

使用接口更难以给出具体的示例,但是使用委托很容易。考虑 Action< T> - 它只代表一个采用 T 参数的方法。很高兴能够无缝转换使用 Action< object> 作为 Action< string> - 任何采用对象的方法相反,当它以 string 呈现时,参数会很好。当然,C#2在某种程度上已经具有代表的协方差和逆变,但是通过从一个委托类型到另一个委托类型的实际转换(创建新实例) - 参见P141-144的示例。 C#4将使这更通用,并且(我相信)将避免为转换创建新实例。 (相反,它将是一个参考转换。)

希望这有点清除 - 如果没有意义,请告诉我!

其他提示

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top