问一个泛型中的隐式转换问题

xyunsh 2009-02-22 01:38:25
public interface IInterface1{}
public class Class1 : IInterface1{}

为什么IList<Class1>不能隐式转换为IList<IInterface1>?

逻辑上似乎可行啊

谢谢
...全文
238 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
jueyingfd 2009-05-18
  • 打赏
  • 举报
回复
还行!!!!!!!!!!!
tommir3 2009-05-18
  • 打赏
  • 举报
回复
好厉害,mark
ViewStates 2009-05-18
  • 打赏
  • 举报
回复

public interface IInterface
{
string Name { get; set; }
}
public class ClassA : IInterface
{
#region IInterface Members

public string Name
{
get;
set;
}

#endregion
}
static void Main(string[] args)
{
IList<ClassA> classes=new List<ClassA>();
classes.Add(new ClassA(){Name="Abc"});
IList<IInterface> tmp = classes.Cast<IInterface>().ToList();
List<ClassA> converted=tmp.Cast<ClassA>().ToList();
converted.ForEach(t => Console.WriteLine(t.Name));
Console.Read();
}
zjb211434 2009-05-18
  • 打赏
  • 举报
回复
确实是不支持,遗憾!
zhushoudong 2009-05-18
  • 打赏
  • 举报
回复
本人就是强制的转换的
龙宜坡 2009-04-22
  • 打赏
  • 举报
回复
这个问题问的本身就不对!

C# 不支持泛型类型的变化。

参见:泛型类型中的变化(C# 编程指南)



遗憾的是强类型集合有自身的缺陷。例如,假设您有一个强类型 List<object>,您想将 List<int> 中的所有元素追加到 List<object> 中。
您可能希望能够如下面的示例一样编写代码:

List<int> ints = new List<int>();
ints.Add(1);
ints.Add(10);
ints.Add(42);
List<object> objects = new List<object>();

// doesnt compile ints is not a IEnumerable<object>
//objects.AddRange(ints);


在这种情况下,您希望能够将 List<int>(它同时也是 IEnumerable<int>)作为 IEnumerable<object> 处理。这样做看起来似乎很合理,因为 int 可以转换为对象。这与能够将 string[] 当作 object[](现在您就可以这样做)非常相似。如果您正面临这种情况,那么您需要一种称为泛型变化的功能,它将泛型类型的一种实例化(在本例中为 IEnumerable<int>)当成该类型的另一种实例化(在本例中为 IEnumerable<object>)。

由于 C# 不支持泛型类型的变化,所以当遇到这种情况时,您需要尝试几种可能的方法来解决此问题。对于最简单的情况,例如上例中的单个方法 AddRange,您可以声明一个简单的帮助器方法来为您执行转换。例如,您可以编写如下方法:
// Simple workaround for single method
// Variance in one direction only
public static void Add<S, D>(List<S> source, List<D> destination)
where S : D
{
foreach (S sourceElement in source)
{
destination.Add(sourceElement);
}
}


它使您能够完成以下操作:

// does compile
VarianceWorkaround.Add<int, object>(ints, objects);



遗憾!



phommy 2009-04-21
  • 打赏
  • 举报
回复
[Quote=引用楼主 xyunsh 的帖子:]
public interface IInterface1{}
public class Class1 : IInterface1{}

为什么IList <Class1>不能隐式转换为IList <IInterface1>?

逻辑上似乎可行啊

谢谢
[/Quote]

简单地说
IList <Class1> 与 IList <IInterface1> 没有任何关系
别说隐式了
显示也转换不了啊
jxph123535 2009-04-21
  • 打赏
  • 举报
回复
mark
xyunsh 2009-04-21
  • 打赏
  • 举报
回复
up
xyunsh 2009-02-23
  • 打赏
  • 举报
回复
up
xyunsh 2009-02-22
  • 打赏
  • 举报
回复
这个知道

就是感觉比较麻烦

为啥不能隐式转换呢?

IInterface1 obj=(IInterface1)Class1Obj;

这个就不需要显式转换了吧
Fibona 2009-02-22
  • 打赏
  • 举报
回复
IList <IInterface1> ls=new IList <Class1>();



要将Class1转换成IInterface1需要强制转换

IInterface1 obj=(IInterface1)Class1Obj;
xyunsh 2009-02-22
  • 打赏
  • 举报
回复
楼上的,你这个编译不过的。
ojekleen 2009-02-22
  • 打赏
  • 举报
回复
IList <IInterface1> ls=new IList<Class1>();
xyunsh 2009-02-22
  • 打赏
  • 举报
回复
总得写段简单的代码进行转换,感觉不是很爽。

大家有什么好的建议么?

110,538

社区成员

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

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

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