无法通过基本接口使用类列表

布达

我的IDerived接口继承自IBase:

public IDerived : IBase { ... }

我有需要IList的方法:

public MyClass
{
    public static void DoSmth(IList<IBase> bases)
    { ... }
}

但是尝试传递派生对象列表:

IList<IDerived> derivedObjs = ...;
MyClass.DoSmth(derivedObjs);

导致错误:

Argument type 'System.Collections.Generic.IList<IDerived> is not assignable to parameter type 'System.Collections.Generic.IList<IBase>'

我可以实现类似“愚蠢”的东西:

MyClass.DoSmth(derivedObjs.Select(d=>d as IBase).ToList());

但这听起来...不专业。

我记得几年前我在与类似的问题作斗争,应该通过允许“ DoSmth”或“ MyClass”将对象转换为基类来解决该问题,但是找不到任何解决方案。

请告知,将派生对象列表传递给需要基类指向的对象列表的方法的正确方法是什么。

谢谢

阿萨德·赛义丁(Asad Saeeduddin)

如果A相对于其类型参数协变的,则ATSomething<TDerived>仅可分配给TSomething<TBase>TDerived从中派生TBaseTSomething

类型在逻辑上是协变的先决条件之一是,它只返回其类型参数的实例,而不必接受它们。像只读的迭代器就是这种情况IEnumerable<T>,但是并非如此IList<T>,在诸如的方法中必须接受类型参数类型的引用Add

例如,考虑以下情况:

class Base: IBase { }
class Derived: IDerived { }
...
MyClass.DoSmth(new List<IDerived>());
...
public static void DoSmth(IList<IBase> bases)
{
    bases.Add(new Base());
}

如果编译器允许您执行此操作,则类型安全性已经破灭,因为aBase不是IDerived

解决方法取决于您在做什么DoSmth如果只迭代bases,则应该接受实际上协变的可迭代接口,即IEnumerable<IBase>

public static void DoSmth(IEnumerable<IBase> bases) { ... }

如果您确实确实需要IList接口支持的操作,那么除了将您现有的更改derivedObjsIList<IBase>或使用Cast创建一个新列表外,它就无济于事了ToList

MyClass.DoSmth(derivedObjs.Cast<IBase>().ToList());

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

通过接口使用静态类?

来自分类Dev

无法从接口基本列表中识别最终接口实现

来自分类Dev

无法弄清楚如何仅通过使用类的功能通过函数删除整个链接列表

来自分类Dev

通过PoolObjectFactory接口使用Pool <T>类实例化

来自分类Dev

C ++通过接口使用从其他几个继承的类

来自分类Dev

使用事件通过表单类实现接口

来自分类Dev

通过泛型类使用接口实现

来自分类Dev

通过使用函数指针与变量参数列表函数接口

来自分类Dev

通过接口动态创建类

来自分类Dev

通过Java类进行接口

来自分类Dev

无法使用Ebean在Play中创建基本模型类

来自分类Dev

实现接口的类中的基本Java接口返回对象

来自分类Dev

通过类接口访问类的属性

来自分类Dev

通过C#中的反射获取接口的基本接口

来自分类Dev

通过Intent传递后,对象列表为null。对象类实现Parcelable接口

来自分类Dev

使用实现接口的类

来自分类Dev

无法从接口转换为类

来自分类Dev

实现类列表中的接口列表

来自分类Dev

C#接口继承-无法识别基本接口方法

来自分类Dev

Typescript对象类成员是通过接口定义的

来自分类Dev

扩展接口与通过匿名类实例化

来自分类Dev

通过实现类名获取导出的接口

来自分类Dev

使用jQuery通过li类名称拆分ul列表

来自分类Dev

通过接口方法获取实现接口的类的汇编版本

来自分类Dev

循环继承和接口-A类无法实现B类接口,而B类却实现A接口

来自分类Dev

如何转换实现接口的具体类列表

来自分类Dev

如何获取实现接口的类的列表?

来自分类Dev

如何获取实现接口的类的列表?

来自分类Dev

从派生接口的列表中选择类

Related 相关文章

热门标签

归档