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中,变体类型参数仅限于通用接口和通用委托类型.
| 归档时间: |
|
| 查看次数: |
323 次 |
| 最近记录: |