我没有参加 PDC 2008,但听说 C# 4.0 宣布支持通用协变和逆变。那是,List<string>
可以分配给List<object>
。怎么可能呢?
在乔恩·斯基特的书中C# 深入探讨,解释了为什么 C# 泛型不支持协变和逆变。它主要用于编写安全代码。现在,C# 4.0 进行了更改以支持它们。会带来混乱吗?
有人知道 C# 4.0 的详细信息可以解释一下吗?
方差仅在以下情况下受支持safe方式 - 事实上,使用 CLR 已有的功能。所以我在书中给出的例子尝试使用List<Banana>
as a List<Fruit>
(或无论它是什么)仍然行不通 - 但其他一些情况会。
首先,它仅支持接口和委托。
其次,它要求接口/委托的作者将类型参数修饰为in
(对于逆变)或out
(对于协方差)。最明显的例子是IEnumerable<T>
它只允许您从中“取出”值 - 它不允许您添加新值。那将成为IEnumerable<out T>
。这根本不会损害类型安全,但可以让你返回一个IEnumerable<string>
从声明返回的方法IEnumerable<object>
例如。
逆变很难给出使用接口的具体示例,但使用委托就很容易。考虑Action<T>
- 这只是代表一个方法,它需要一个T
范围。如果能够无缝转换使用Action<object>
as an Action<string>
- 任何需要一个object
当参数带有一个时就会很好string
反而。当然,C# 2 在某种程度上已经具有委托的协变和逆变,但是通过从一种委托类型到另一种委托类型的实际转换(创建一个新实例) - 有关示例,请参阅 P141-144。 C# 4 将使这个更加通用,并且(我相信)将避免为转换创建新实例。 (这将是一个引用转换。)
希望这能澄清一点——如果没有意义,请告诉我!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)