泛型的向上转型出错.net3.5

cloudtian101 2012-03-17 12:43:38
系统里有两个类是继承关系,如son继承于parent,我用以下代码就会报错。
ParentClass<parent> li = new Parent<parent>();
li.Add(new parent());
SonClass<son> sli = li;//错误

错误 1 无法将类型“System.Collections.Generic.ParentClass<ConsoleApplication3.parent>”隐式转换为“System.Collections.Generic.SonClass<ConsoleApplication3.son>”

据说这个是3.5的bug在4.0中修正了,但3.5中有什么办法能解决吗?
...全文
300 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
cloudtian101 2012-03-18
  • 打赏
  • 举报
回复
楼上的,我的代码输入错了,改过一次,你仔细看看。
cloudtian101 2012-03-17
  • 打赏
  • 举报
回复
哦,写反了
ParentClass<son> li = new Parent<son>();
li.Add(new son());
SonClass<paren> sli = li;
还是那个错误
porschev 2012-03-17
  • 打赏
  • 举报
回复
[Quote=引用楼主 cloudtian101 的回复:]
系统里有两个类是继承关系,如son继承于parent,我用以下代码就会报错。
ParentClass<parent> li = new Parent<parent>();
li.Add(new parent());
SonClass<son> sli = li;//错误

错误 1 无法将类型“System.Collections.Generic.ParentCl……
[/Quote]

这个根本就是不BUG,.NET4.0也没有修改。。。

http://www.cnblogs.com/LoveJenny/archive/2012/03/13/2392747.html

上面的例子,可以很清楚让你理解这个问题
机器人 2012-03-17
  • 打赏
  • 举报
回复
不能算是bug,应该算是.net 3.5编译器的限制.
cloudtian101 2012-03-17
  • 打赏
  • 举报
回复
为什么逻辑上是正确的,编译却报错?真的是有bug吗?
cloudtian101 2012-03-17
  • 打赏
  • 举报
回复
确实象楼上所说,在4.0中依然测试失败了。但4.0关于泛型的转型确实修正了一些,如果把基类parent换成接口编译是会通过,如:
List<Son> li = new List<Son>();
li.Add(new Son());
IEnumerable<Parent> p = li;
楼上的说的正确。
cloudtian101 2012-03-17
  • 打赏
  • 举报
回复
确实象楼上所说,在4.0中依然测试失败了。但4.0关于泛型的转型确实修正了一些,如果把基类parent换成接口,编译是会通过,如:
List<Son> li = new List<Son>();
li.Add(new Son());
IEnumerable<Parent> p = li;
  • 打赏
  • 举报
回复
协变、逆变仅限于接口,这凸显了它没有本质只有接口的特点。因此根本不是你的那种意思!
  • 打赏
  • 举报
回复
没有修正什么,只不过有了新的东西,而不是修正。你的代码在.net4.0中也是无法编译通过过,必须推到了重新设计为所谓哦的协变(但是当你了解什么是协变时会发现更多别扭的禁忌)。

“onClass<son> sli = li”这种代码用到哪里也必须立刻看出它是错误的。如果有一个语言编译器说它可以操作,我们还是赶紧扔掉这个不靠谱的语言吧。
色拉油 2012-03-17
  • 打赏
  • 举报
回复
 class Program
{
public static void Main()
{
List<Child> children = new List<Child>();
children.Add(new Child());
children.Add(new Parent() as Child);
}
}

class Parent
{ }

class Child : Parent
{ }
色拉油 2012-03-17
  • 打赏
  • 举报
回复
class Program
{
public static void Main()
{
List<Child> children = new List<Child>();
children.Add(new Child());
children.Add(new Parent() as Child);
}
}

class Parent
{ }

class Child : Parent
{ }

111,126

社区成员

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

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

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