首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么我不能将IList <ChildType>传递给F(IEnumerable <ParentType>)?

这个问题是关于C#编程语言中的泛型和类型约束。在C#中,不能将IList<ChildType>传递给F(IEnumerable<ParentType>),因为IList<ChildType>是IEnumerable<ParentType>的子类型,但它们之间的类型不是协变的。

协变是指在泛型类型参数中,如果T1是T2的子类型,则可以将泛型类型G<T1>的实例传递给泛型类型G<T2>。在这种情况下,泛型类型G<T1>和G<T2>被称为协变类型。

在C#中,只有接口和委托可以声明协变类型参数。协变类型参数使用out关键字进行声明。例如,IEnumerable<out T>就是一个协变类型参数。

在这个问题中,IList<ChildType>和IEnumerable<ParentType>之间的类型不是协变的,因为IList<T>接口没有声明T类型参数为协变的。

为了解决这个问题,可以使用泛型方法或将IList<ChildType>转换为IEnumerable<ParentType>。例如:

代码语言:csharp
复制
public void F<T>(IEnumerable<T> items) where T : ParentType
{
    // ...
}

IList<ChildType> list = new List<ChildType>();
F(list.Cast<ParentType>());

这里,我们使用了泛型方法F<T>,并使用Cast<ParentType>()方法将IList<ChildType>转换为IEnumerable<ParentType>。

总之,这个问题是由于C#中的类型协变和类型不协变导致的。为了解决这个问题,可以使用泛型方法或将IList<ChildType>转换为IEnumerable<ParentType>。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

WCF技术剖析之十四:泛型数据契约和集合数据契约(下篇)

比如,在同一个服务契约中,定义了如下3个操作,他们的参数类型分别为IEnumerableIList和Customer[]。...但是对于不能预先确定元素类型的IEnumerableIList就不一样了。 下面将演示IEnumerableIList两种类型的序列化。...、Array与IList序列化做对比,采用相同的编程方式,使用相同的数据。...而实际上,对于服务契约来说,如果某个操作包含有IEnumerable或者IList类型的参数,当该服务契约被客户端导入后,IEnumerable或者IList参数类型将会自动转换成object[]。...,在定义CustomerCollection的时候,为什么加上一个默认无参的构造函数,这不是多此一举吗?

1.5K70

.net源码分析 – List

IEnumerable是支持枚举接口,实现这接口表示支持遍历,成员就是上面的IEnumerator。..._syncRoot上面有说到,内置的用于lock的对象,如果在多线程时只是操作这个集合就可以lock这个来保证线程安全,当然一般来说这个是内部用的,虽然对List本身来说没什么用,这个取的话是不会把对象...List不是线程安全,需要我们自己用锁搞定, IsReadOnly也是false, 那为什么要继承IReadOnlyList呢,是为了提供一个转换成只读List的机会,比如有的方法希望进来的...如果新得到的长度比进来的min小的话则就用min,也就是选大的,这种情况在InsertRange时有可能发生,因为insert的list很可能比当前list的元素个数多。...其他大部分方法都是通过Array的静态函数实现,不多说,需要注意的是List继承自IList,所以可以转成IList,转之后泛型就没了,如果是List,转成IList的话和IList<object

72980
  • 30分钟泛型教程

    一、泛型入门: 我们先来看一个最为常见的泛型类型List的定义 (真正的定义比这个要复杂的多,这里删掉了很多东西) [Serializable] public class List : IList..., ICollection, IEnumerable { public T this[int index] { get; set; } public void Add(...如果你这个方法里的处理逻辑不适用于字符串的参数 而使用者又了一个字符串进来 编译器是不会报错的, 只有在运行期才会报错 (如果质管部门没有测出这个运行期BUG,那么不知道要造成多大的损失呢) 这就是我们常说的...MyOtherType的实例传递给这个方法 然而一个方法如果接收MyOtherType类型的参数 却可以把MyThirdType类型的实例传递给这个方法 写成如下方式也不会出错...等 这里不对这些接口做详细描述了 值说说为什么要有泛型接口。

    71960

    C#4.0新增功能03 泛型中的协变和逆变

    始终可以将此实参安全地传递给基础方法,因为该方法的形参属于类型 Base。 通常,协变类型参数可用作委托的返回类型,而逆变类型参数可用作参数类型。...此示例创建一个空 List (在 Visual Basic 中为List(Of Derived) ),并且说明可以将该类型传递给 PrintBases 且在不进行强制转换的情况下将该类型分配给类型...但是,该对象传递 IComparer,而是传递一个用于实现 ShapeAreaComparer 的 IComparer对象。...但不能将协变类型参数用作接口方法的泛型类型约束。 如果接口的方法具有泛型委托类型的参数,则接口类型的协变类型参数可用于指定委托类型的逆变类型参数。...MSIL 汇编程序 执行此类检查,但如果你尝试加载违反规则的类型,则会引发 TypeLoadException 。

    1.3K20

    WPF Binding学习(四) 绑定各种数据源

    如果想用更复杂的结构来表示这一标题或数据,则可为GridViewColumn设置Head Template和Cell Template,它们的类型都是DataTemplate  接下来下后台代码 IList...接下来看一下ObservableCollection这个集合,我们可以看到在这里使用的是ObservableCollection集合而并非平常的List集合,那么为什么呢,因为ObservableCollection...类型对象,而IEnumerable又派生自IEnumerable,所以可以作为列表控件的Items Source使用。    ...BindsDirectlyToSource这句话是告诉Binding只是将UI上的值传递给源而不是被ObjectDataProvider包装的Caculator,同时UpdateSourceTrigger...可以写。 注意:  在ObjectDataProvider对象作为Binding的Source的时候,这个对象本身就代表了数据,所以这里的Path使用的“.”,而不是Data属性。

    4.3K30

    内存优化:Boxing

    然而,在实践中,许多开发人员最终都会这样说:“好吧,的应用程序中的一些流量是由一些系统类生成的,这些系统类的名称是一生中第一次看到的。想这可能是因为一些糟糕的代码设计。现在该怎么做?”...实际上,这将是一系列文章,将在其中分享的内存流量分析经验:为什么是“糟糕的代码设计”,如何在内存中找到其踪迹,当然还有认为的最佳实践。...例如: int i = 5; object o = i; // 发生装箱 为什么这是个问题?值类型存储在栈中,而引用类型存储在托管堆中。...显然,如果这种情况频繁发生,应用程序的性能将会受到影响。...这里典型的主要头痛是使用 foreach 枚举一个集合,只知道它实现了 IEnumerable 接口。

    11410

    【Blog.Core开源】网关自定义认证鉴权与

    ,这也是一个方案,今天也会给大家讲讲怎么获取,怎么。...当然个人的意见还是网关仅仅是解析token里有的,传递给下游,至于查库的那些,还是下游获取吧,这是的个人意见,并不是完全正确。...为什么呢,大家想想,咱们在网关里写拦截器或者中间件,每次接口请求,都根据header中的token来查库,这样不管下游需不需要,不管下游接口是不是匿名都去查库一下,会造成资源浪费,比如我就想搜索下list...也可以传递给下游服务。...,1、分别是动态从Claim中获取并用Request的Header值,2、直接在Request中传递固定Header值,3、获取下游服务的Response的Header给上游网关。

    49210

    「思维导图学前端 」一文搞懂Javascript对象,原型,继承

    当然,YY一下就好了,保证你没有足够的时间给所有知识点都画上思维导图,挑重点即可。 提纲思路 当我们要研究一个问题或者知识点时,关注点无非是: 是什么? 做什么? 为什么?...不过这里说说刚学习原型时的疑惑,疑惑的是为什么构造函数有属性prototype指向原型,而实例又可以通过__proto__指向原型,究竟prototype和__proto__谁是原型?...) {} F.prototype = proto; return new F(); } 关键点:利用一个空对象过渡,解除子类原型和父类构造函数的强关联关系。...function inherit(childType, fatherType) { childType.prototype = Object.create(fatherType.prototype)...这是一个比较危险的动作,同时也是一个性能不佳的方法,推荐使用。

    75320
    领券