IList实例可以隐式转换成IList实例????

leon8082 2009-06-11 05:08:38
我知道IList实例无法显示或隐式转换成IList<T>实例,但是为什么IList<T>实例可以隐式转换成IList实例我就不知道了

实际情况是VS2005 FCL2.0,IList<T>实例可以隐式转换成IList实例

请各位高手指教~~~~谢谢
...全文
285 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
kirinboy 2009-06-12
  • 打赏
  • 举报
回复
IList<T>确实没有实现IList,但是List<T>实现了IList,同时也实现了IList<T>,明白?
leon8082 2009-06-12
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 coconutyf 的回复:]
看msdn关于List <T>的定义

C# code[SerializableAttribute]
public class List<T> : IList<T>, ICollection<T>,
IEnumerable<T>, IList, ICollection, IEnumerable



由此可见并不是IList <T>可转换成IList,而是List <T>本身就实现了IList接口。
[/Quote]

不知道这位大哥看的是哪个版本的MSDN,小弟看的是vs2005安装时带的那个版本的,解释如下:
[ComVisibleAttribute(true)]
public interface class IList : ICollection, IEnumerable

public interface IList<T> : ICollection<T>, IEnumerable<T>,
IEnumerable

没有见到大哥所说的继承了IList啊?好奇怪~~~~
wanghui0380 2009-06-12
  • 打赏
  • 举报
回复
net4.0 以上可以直接转换,称作“泛型协变和反变”
参考
http://www.yfeshop.cn/html/NETboke/200811/-NET4-0zhongdefanxingxiebianhefanbian_6363.html

net4以下尚未有此特性,你必须手动遍历 或 自己实现相关的cast<T>的方法
coconutyf 2009-06-12
  • 打赏
  • 举报
回复
看msdn关于List<T>的定义
[SerializableAttribute] 
public class List<T> : IList<T>, ICollection<T>,
IEnumerable<T>, IList, ICollection, IEnumerable


由此可见并不是IList<T>可转换成IList,而是List<T>本身就实现了IList接口。

phommy 2009-06-12
  • 打赏
  • 举报
回复
IList 与 IList<T>无任何关系。当然,它们都实现了IEnumerable接口,不过这也算的话,恐怕还要算上它们都是从object继承来的

3楼的例子不能说明“IList会被认为是IList <T>的父接口”,输出是True是因为List<T> (而不是IList<T>) 实现了IList
leon8082 2009-06-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 lovvver 的回复:]
IList <T> 可以隐私转换为IList
IList相当于IList <object>,需要显示转换为IList <T>
[/Quote]

IList相当于IList<object>?具体出处在那里?


另外纠正一下我自己的错误,其实IList<T>实例和IList实例不能互相隐式转换,但是IList会被认为是IList<T>的父接口,验证程序如下:
IList<object> testG = new List<object>();
IList test = new ArrayList();

Console.WriteLine("testG is IList:{0}",(testG is IList));
Console.WriteLine("test is IList<object>:{0}", (test is IList<object>));
Console.WriteLine("test is IList<string>:{0}", (test is IList<string>));

Console.Read();

结果显示:
testG is IList:True
test is IList<object>:False
test is IList<string>:False

请高手解释一下

Console.Read();
nyq1999 2009-06-12
  • 打赏
  • 举报
回复
你可以用Object引用一个string类型的对象,

You can use the type of object refer a string object ,but cannt use the type of string refer a object
qiufengilove 2009-06-12
  • 打赏
  • 举报
回复
这样说吧
.net里面是有这样的潜规则的
就是小容器的类型可以隐式的转换成大容器的类型
比如
int16可以隐式转换成int32
int32可以隐式转换成double
IList<T>只是IList其中指向具体一类的小容器
coconutyf 2009-06-12
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 leon8082 的回复:]
引用 5 楼 coconutyf 的回复:
看msdn关于List <T>的定义

C# code[SerializableAttribute]
public class List <T> : IList <T>, ICollection <T>,
IEnumerable <T>, IList, ICollection, IEnumerable


由此可见并不是IList <T>可转换成IList,而是List <T>本身就实现了IList接口。


不知道这位大哥看的是哪个版本的MSDN,小弟看的是vs2005安装时带的那个版本的,解释如下:
[ComVisibleAttribute(true)]
publi…
[/Quote]

看仔细了,是List<T>,接口本身是不能实例化的,能够实例化的是实现接口的类。而IList<T>和IList之间并无继承关系,只是List<T>同时实现了IList<T>和IList两个接口而已。
lovvver 2009-06-12
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 leon8082 的回复:]
引用 1 楼 lovvver 的回复:
IList <T> 可以隐私转换为IList
IList相当于IList <object>,需要显示转换为IList <T>


IList相当于IList <object>?具体出处在那里?


另外纠正一下我自己的错误,其实IList <T>实例和IList实例不能互相隐式转换,但是IList会被认为是IList <T>的父接口,验证程序如下:
IList <object> testG = new List <object>();
IList test = new ArrayList();

Console.WriteLine("testG is …
[/Quote]

我说的这个相当于,是指使用方面,而非其后面的类型,以及数据结构。
dony_feng 2009-06-11
  • 打赏
  • 举报
回复
不太明白。Mark
lovvver 2009-06-11
  • 打赏
  • 举报
回复
IList<T> 可以隐私转换为IList
IList相当于IList<object>,需要显示转换为IList<T>

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧