gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:00:17 29 4
gpt4 key购买 nike

为什么这样做:

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<Coupon>而不是 IList<ICoupon> . IList<Coupon>不源自 IList<ICoupon>因为 C# 3 不支持泛型变体。 (C# 4 确实支持泛型变体,但在这种情况下它仍然不会派生。考虑到收到 IList<ICoupon> 的任何人都可以尝试将 SomeEvilTypeThatImplementsICoupon 填充到其中。但是 IList<Coupon> 不能接受,因为 SomeEvilTypeThatImplementsICoupon 不t 派生自 Coupon。请参阅 http://hestia.typepad.com/flatlander/2008/12/c-covariance-and-contravariance-by-example.html 以了解有关此可兑换性问题的讨论,尽管上下文略有不同,以及从那里链接的 Eric Lippert 文章。)

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

关于c# - 接口(interface)列表与派生类型列表 - 无法将表达式类型转换为返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1864080/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com