先看代码:
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
为什么可以转换?
-
接口实现:如果
numbers
的类型是IList
或者一个派生自IList
的接口(比如List<T>
),那么它可以直接被转换为IList
。 -
协变与逆变:在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
。
本站资源均来自互联网,仅供研究学习,禁止违法使用和商用,产生法律纠纷本站概不负责!如果侵犯了您的权益请与我们联系!
转载请注明出处: 免费源码网-免费的源码资源网站 » c#中 关于 List<T> 和 IList 之间的转换
发表评论 取消回复