集合的隐式转换这周遇到了一个关于C#在集合中隐式转换的问题。虽然这(使用隐式)可能不是我们的最终方法,但我想至少完成代码以提供团队作为一种选择。我将问题归结为以下示例:我的示例中有两个类:一个代表业务对象(Foo),另一个代表该业务项(FooVO)的客户端版本(ViewObject),如下所示...publicclassFoo{publicstringId{get;设置;}公共字符串BusinessInfo{get;设置;}}公共类FooVO{公共字符串Id{get;设置;}publicstaticimplicitoperatorFooVO(Foofoo){returnnewFooVO{Id=foo.Id};我的问题是当我有一个Foo对象列表并想使用我的隐式运算符将它们转换为FooVO对象列表时。列表foos=GetListOfBusinessFoos();//获取要转换的业务对象我试过ListfooVOs=foos;//错误和列表fooVOs=(List)foos;//ERROR甚至ListfooVOs=foos.Select(x=>x);//错误我知道我可以在循环中执行此操作,但我希望能够以直接(LINQ?)方式一次转换一个对象。有任何想法吗?先感谢您。编辑修复示例中的错字几乎每天都会有人问这样的问题。你不能这样做,因为它违反了类型安全:Listg=newList();清单a=g;//这应该合法吗?a.Add(新老虎());//没有;我们刚刚在长颈鹿列表中添加了一只老虎。在C#4.0中,您可以从IEnumerable隐式转换为IEnumerable,因为没有“添加”方法来搞砸事情。但是,如果元素类型的转换是用户定义的,那么您永远无法进行“协变”转换。它必须是引用或身份转换。您需要创建第二个列表并一次复制一个。或者使用Select和ToList等LINQ辅助方法来为您完成这项工作。你想要的类型系统概念的名字是“covariance”;协方差关系是您推理“长颈鹿是动物,所以长颈鹿序列是动物序列”的协方差关系。如果您对该主题感兴趣,可以在此处阅读我们如何在C#4.0中添加协变(和逆变):http://blogs.msdn.com/b/ericlippert/archive/tags/covariance+and+contravariance/default.aspx从底部开始。您的示例不起作用的原因是您试图将IEnumerable分配给列表。以下应该工作。列表fooVos=foos.Select(x=>x).ToList();Listd=newList(foos.Select(x=>(FooVO)x));为我工作。使用ConvertAll方法将静态隐式运算符FooVO(Foofoo)作为参数传递。以上就是C#学习教程:集合的隐式转换的全部内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注——ListfooVOs=foos.ConvertAll(FooVO.FooVO);本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
