【发布时间】:2019-03-07 18:08:31
【问题描述】:
我有一个接口 ID,它是从另一个接口 IB 派生的。
public interface IB
{
int Num { get; }
}
public interface ID : IB
{
}
假设我们有一个实现 ID 的类:
public class DImpl : ID
{
public int Num { get; set; }
}
我知道我可以调用一个接收 IB 的函数,该函数带有一个作为 ID 保存的变量。
public void FuncOfIB(IB b)
{
// do something
}
public static void Main()
{
ID d = new DImpl();
FuncOfIB(d); // Works
}
我想调用一个接收List<IB>作为参数的函数:
void ProcessListOfIB(List<IB> list)
{
// Some code
}
但是我好像不能用List<ID>调用这个函数。
public static void Main()
{
List<ID> listID = new List<ID>();
ProcessListOfIB(listID); // Doesn't work
}
有人知道为什么吗?我该如何解决?谢谢。
编辑:我需要函数ProcessListOfIB 从列表中删除一个项目,所以复制并不能解决我的问题...
【问题讨论】:
-
您可以使用 linq 解决此问题:
listD.Cast<IB>().ToList() -
问题是我希望函数 ProcessListOfIB() 将删除原始列表中的成员。我将编辑我的原始帖子
-
List允许您添加项目,因此ProcessListOfIB可能会调用list.Add(x),其中x的类型为IB。这意味着您的列表将不再完全由ID项目组成。简而言之,这就是不允许隐式转换的原因。 -
那么,您的 ProcessListOfIB 方法中的代码真的需要 List
吗?它可能会对 IEnumerable 类型的方法参数感到满意吗?如果您的 ProcessListOfIB 方法可以使用 IEnumerable 而不是 List ,则使用使用 IEnumerable 的方法参数。通过这种方式,该方法不仅可以与其他集合类型一起使用,而且由于 IEnumerable 中的泛型类型参数为 covariant,您的问题就会消失。
标签: c#