先看代码:

List<int> numbers = new List<int> { 1, 2, 3 };  
IList list = numbers as IList; // 转换成功,因为 List<int> 实现了 IList  
  
// 现在 list 和 numbers 指向同一个对象  
Console.WriteLine(list.Count); // 输出 3  
Console.WriteLine(list[0]);    // 输出 1

为什么可以转换?

  1. 接口实现:如果 numbers的类型是 IList 或者一个派生自 IList 的接口(比如 List<T>),那么它可以直接被转换为 IList

  2. 协变与逆变:在C#中,接口支持协变和逆变。简单来说,协变允许你将一个更具体的类型(派生类)的实例赋值给一个更抽象的类型(基类或接口)的变量。由于 IList 是一个接口,任何实现了 IList 的类都可以被赋值给一个 IList 类型的变量。

list如何获取numbers的值?

当 value 被成功地转换为 IList 并赋值给 list 变量后,list 实际上成为了一个指向 value 所引用的对象的另一个引用(在内存中,它们指向同一个对象)。因此,通过 list 你可以访问到 value 所引用的对象提供的所有 IList 接口的成员,包括但不限于 Count 属性(获取列表中元素的数量)和 this[int index] 索引器(通过索引访问列表中的元素)。

如果转换失败(即 value 不是 IList 或其兼容类型),list 将为 null。在这种情况下,任何尝试通过 list 访问成员的操作都会抛出 NullReferenceException。因此,在实际代码中,通常会在尝试使用 list 之前检查它是否为 null

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部