泛型铸造

Vas*_*aka 8 .net c# generics casting

我只是在.NET泛型类型转换中没有得到什么.有人可以解释下面的代码片段中会发生什么吗?

void Main()
{
    IEnumerable<int> ints = new List<int>();
    IEnumerable<string> strings = new List<string>();

    var rez1=(IEnumerable<object>)ints; //runtime error
    var rez2=(IEnumerable<object>)strings; //works
    var rez3=(List<object>)strings; //runtime error
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*Jon 11

让我们从第二行开始,这是最简单的.

该转换是有效的,因为类型参数IEnumerable<T>现在是协变的(这就是outin的out T作用).这意味着你可以施放IEnumerable<Derived>IEnumerable<Base>自由.

第一行似乎是相同的情况,因为int是值类型,所以不起作用.接口方差根本不适用于值类型,因为值类型并不真正继承System.Object; 它们可以盒装object,但这是不一样的.文件提到了这一点

差异仅适用于参考类型; 如果为变量类型参数指定值类型,则该类型参数对于生成的构造类型是不变的.

最后,第三行不起作用,因为类型参数List<T>不变的.你可以看到out它的类型参数没有; 规则不允许因为List<T>不是接口:

在.NET Framework 4中,变体类型参数仅限于通用接口和通用委托类型.