加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 接口列表与派生类型列表 – 无法将表达式类型转换为返回类

发布时间:2020-12-15 18:16:34 所属栏目:百科 来源:网络整理
导读:为什么这样做: public IListICoupon GetCouponsForSite(string siteSlug){ var coupons = _db.Coupons.Where(x = x.Site.slug == siteSlug) .Select(x = new Coupon(x.id)); var list = new ListICoupon(); foreach (var coupon in coupons) { list.Add(cou
为什么这样做:
public IList<ICoupon> GetCouponsForSite(string siteSlug)
{
    var coupons = _db.Coupons.Where(x => x.Site.slug == siteSlug)
                     .Select(x => new Coupon(x.id));

    var list = new List<ICoupon>();
    foreach (var coupon in coupons)
    {
        list.Add(coupon);
    }

    return list;
}

但这确实不起作用(错误 – 无法将表达式转换为返回类型):

public IList<ICoupon> GetCouponsForSite(string siteSlug)
{
    return _db.Coupons.Where(x => x.Site.slug == siteSlug)
                      .Select(x => new Coupon(x.id)).ToList();
}

解决方法

因为db.Coupons … ToList()返回IList<优惠券>而不是IList< ICoupon>.的IList<优惠券>不是来自IList< ICoupon>因为C#3不支持通用方差. (C#4确实支持通用方差,但在这种情况下它仍然不会得到.考虑到收到IList< ICoupon>的人可能会尝试将SomeEvilTypeThatImplementsICoupon填充到其中.但IList< Coupon>无法接受,因为SomeEvilTypeThatImplementsICoupon不是来自优惠券.有关此可兑换问题的讨论,请参阅 http://hestia.typepad.com/flatlander/2008/12/c-covariance-and-contravariance-by-example.html,尽管情况略有不同,并且Eric Lippert文章从那里链接.)

(相比之下,你的第一个片段显式构造了一个List< ICoupon>,它可以包含任何实现ICoupon的东西,然后将一些Coupon对象放入该列表.现在如果接收者决定将SomeEvilTypeThatImplementsICoupon戳入其中,一切都很好,因为列表是为了保存任何ICoupon,而不仅仅是实际的优惠券对象.)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读