当前位置: 首页 > 编程语言 > C#

接口列表和派生类型列表——无法将表达式类型转换为返回类型分享

时间:2023-04-10 19:40:11 C#

接口列表和派生类型列表——无法将表达式类型转换为返回类型=_db.Coupons.Where(x=>x.Site.slug==siteSlug).Select(x=>newCoupon(x.id));varlist=new列表();foreach(优惠券中的优惠券){list.Add(优惠券);}返回列表;但这真的行不通(错误——无法将表达式转换为返回类型):publicIListGetCouponsForSite(stringsiteSlug){return_db.Coupons.Where(x=>x.Site.slug==siteSlug).Select(x=>新优惠券(x.id)).ToList();因为db.Coupons...ToList()返回IList而不是IList。IList不是来自IList,因为C#3不支持通用差异。(C#4确实支持通用方差,但在这种情况下仍然不会得到它。考虑接收IList可能会尝试将SomeEvilTypeThatImplementsICoupon填充到其中。但IList不能接受,因为SomeEvilTypeThatImplementsICoupon不是来自优惠券。请参阅http:http://hestia.typepad.com/flatlander/2008/12/c-covariance-and-contravariance-by-example.html讨论了这个可转换性问题,尽管上下文略有不同,EricLippert文章链接从那里开始。)(相比之下,您的第一个代码片段显式构造了一个列表,该列表可以包含任何实现ICoupon的内容,然后将一些Coupon对象放入该列表中。现在,如果接收方决定将SomeEvilTypeThatImplementsICoupon放入其中,一切都很好,因为该列表旨在保存任何ICoupon,而不仅仅是实际的优惠券对象。)它不能将List隐式转换为List。试试这个:publicIListGetCouponsForSite(stringsiteSlug){return_db.Coupons.Where(x=>x.Site.slug==siteSlug).Select(x=>newCoupon(x.id)).Cast()。列表();这样做的基本原因是,如果您有一个类FancyCoupon:ICoupon并尝试将其放入列表中,那么它将失败,因为FancyCoupon不是来自优惠券(仅ICoupon),但它应该可以很好地放入列表中。因此,虽然乍一看它似乎应该能够将一种用作另一种,但这两种类型之间存在相当重要的差异。cast调用基本上遍历列表并对每个新列表进行类型转换(出于性能原因,幕后还有更多内容,但出于实际目的,您可以这样想)。(已更新并修复评论)IQueryable不是从IList派生的。这是因为编译器在Selectas泛型类型参数中推断出ICoupon而不是Coupon。因此,按照其他人提出的Select(这不是很有效,因为它需要遍历所有项目),您可以通过指定正确的Selectgenerics类型来使用隐式转换(或更正确的方差)而不是显式转换:publicIListGetCouponsForSite(stringsiteSlug){return_db.Coupons.Where(x=>x.Site.slug==siteSlug).Select(x=>newCoupon(x.id)).ToList();}(需要用对应类型的Coupons集合替换吗?)以上就是C#学习教程:接口列表和派生类型列表-不能将表达式类型转换为返回类型的所有内容分享,如果对大家有用以及需要了解更多C#学习教程的,希望大家多多关注~本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: