一尘不染

在C#4.0中如何实现通用协方差和反方差?

c#

我没有参加PDC
2008,但是我听到一些消息,宣布C#4.0支持通用协方差和反方差。即List<string>可以分配给List<object>。怎么可能

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

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


阅读 280

收藏
2020-05-19

共1个答案

一尘不染

仅以 安全的 方式支持方差-实际上,使用CLR已具备的功能。因此,我在本书中尝试使用a
List<Banana>作为List<Fruit>(或其他形式)的示例仍然无法使用-但还有其他一些情况。

首先,只支持接口和委托。

其次,它要求接口/委托的作者将类型参数修饰inout(对于协方差)或(对于协方差)。最明显的例子是IEnumerable<T>,仅允许您从中“取出”值-不允许添加新值。那将成为IEnumerable<out T>。这一点也不损害类型安全,但是可以让您IEnumerable<string>从声明为要返回的方法中返回IEnumerable<object>

协方差很难给出使用接口的具体示例,但是使用委托很容易。考虑Action<T>-仅代表采用T参数的方法。能够无缝地使用Action<object>as
进行转换将是很好的Action<string>-任何带有object参数的方法在以a
string代替时都会很好。当然,C#2在某种程度上已经具有委托的协变性和协变性,但是通过从一种委托类型到另一种委托类型的实际转换(创建新实例),请参见P141-144。C#4将使其变得更通用,并且(我相信)将避免为转换创建新实例。(这将是参考转换。)

希望这可以清除一点-如果没有任何意义,请通知我!

2020-05-19