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

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

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

逻辑上似乎可行啊

谢谢
...全文
285 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
  • 打赏
  • 举报
回复
总得写段简单的代码进行转换,感觉不是很爽。

大家有什么好的建议么?
代码下载链接: https://pan.quark.cn/s/90052d681b2f 本书系统地阐述了利用C语言进行程序开发的各种方法与技巧,全书总共分为十二个章节,涵盖了从基础到高级的多个方面,包括但不限于基础知识、指针运用、数据结构、算法设计、数学运算、文件处理、库函数应用、图形图像生成、系统调用、加密与安全机制、游戏开发以及综合案例等。整个书籍精心设计了三百个实例,每个实例都着重展示了其在实际应用的价值。本书既适合作为C语言编程的入门教材供初学者研习,也能够为程序开发者、相关专业培训机构的教师和学生提供参考和借鉴。第一章聚焦于基础知识,详细介绍了进制转换、条件判断、多重循环图形打印、循环的数学应用、数组操作、字符与字符串处理、函数使用、趣味计算、宏定义与位运算等内容。第二章深入探讨了指针的相关知识,包括指针变量、指针与数组的关系、指针与函数的交互、字符串与指针的结合以及指向指针的指针运用。第三章着重于数据结构的学习,涵盖了结构体、链表、栈与队列、串与广义表、二叉树以及图及其应用等多个重要主题。第四章详细介绍了算法设计,涉及简单求解算法、排序算法、查找算法、数学定理与猜想以及逻辑推理与判断等内容。第五章围绕数学应用展开,讨论了素数、整数趣题、数学求解、矩阵运算以及生活的数学实例。第六章专门讲解文件操作,包括了文件读写操作、文件内容处理、文件的创建与查找删除、以及文件相关操作等。第七章介绍了库函数的调用,涵盖了时间转换与操作函数、数学函数、字符串与字符函数以及其他各类函数的使用方法。第八章则聚焦于图形图像的处理,详细介绍了基本图形的绘制、色彩填充与使用技巧等。

111,129

社区成员

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

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

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