C# 实现接口B Can'的接口D列表;不能被视为列表<;B>;

C# 实现接口B Can'的接口D列表;不能被视为列表<;B>;,c#,C#,我有一个接口ID,它是从另一个接口IB派生的 public interface IB { int Num { get; } } public interface ID : IB { } 假设我们有一个实现ID的类: public class DImpl : ID { public int Num { get; set; } } 我知道,我可以调用一个函数,该函数使用一个作为ID保存的变量来接收IB public void FuncOfIB(IB b) { //

我有一个接口ID,它是从另一个接口IB派生的

public interface IB
{
    int Num { get; }
}

public interface ID : IB
{

}
假设我们有一个实现ID的类:

public class DImpl : ID
{
     public int Num { get; set; }
}
我知道,我可以调用一个函数,该函数使用一个作为ID保存的变量来接收IB

public void FuncOfIB(IB b)
{
     // do something
}

public static void Main()
{
     ID d = new DImpl();
     FuncOfIB(d); // Works
}
我想调用一个函数,该函数接收一个
列表
作为参数:

void ProcessListOfIB(List<IB> list)
{
   // Some code
}
void ProcessListOfIB(列表)
{
//一些代码
}
但我似乎无法使用
List
调用此函数

publicstaticvoidmain()
{
List listID=新列表();
ProcessListOfIB(listID);//不工作
}
有人知道为什么吗?我怎样才能修好它?多谢各位


编辑:我需要函数
ProcessListOfIB
从列表中删除一项,因此复制并不能解决我的问题…

您可以创建泛型方法并将类型限制为IB:

void ProcessListOfIB<T>(List<T> list) where T:IB
{
    // Some code
}
void ProcessListOfIB(列表列表),其中T:IB
{
//一些代码
}

您可以创建泛型方法并将类型限制为IB:

void ProcessListOfIB<T>(List<T> list) where T:IB
{
    // Some code
}
void ProcessListOfIB(列表列表),其中T:IB
{
//一些代码
}

如果您只需要在集合中循环(而不是修改它):

void ProcessListOfIB(IEnumerable列表)
{
//一些代码
}

如果您只需要在集合中循环(而不是修改它):

void ProcessListOfIB(IEnumerable列表)
{
//一些代码
}

列表未标记为协变或逆变(因为它不能,它不是一个接口),所以这就是它不工作的原因。

列表未标记为协变或逆变(因为它不能,它不是一个接口),所以这就是它不工作的原因。

您可以使用linq:
listD.Cast()解决这个问题.ToList()
问题是我希望函数ProcessListOfIB()将删除原始列表中的一个成员。我将编辑我的原始postA
列表
允许您添加项目,因此
ProcessListOfIB
可以调用
List.add(x)
,其中
x
的类型为
IB
。这意味着您的列表将不再完全由
ID
项组成。这就是不允许隐式强制转换的原因。那么,ProcessListOfIB方法中的代码真的需要列表吗?它可能对IEnumerable类型的方法参数感到满意吗?如果ProcessListOfIB方法可以使用IEnumerable而不是List,则使用IEnumerable的方法参数。通过这种方式,该方法不仅可以用于其他集合类型,而且由于IEnumerable中的泛型类型参数,您的问题也将消失。可能的重复项可以使用linq解决此问题:
listD.Cast().ToList()
问题在于我需要函数ProcessListOfIB()将删除原始列表中的成员。我将编辑我的原始postA
列表
允许您添加项目,因此
ProcessListOfIB
可以调用
List.add(x)
,其中
x
的类型为
IB
。这意味着您的列表将不再完全由
ID
项组成。这就是不允许隐式强制转换的原因。那么,ProcessListOfIB方法中的代码真的需要列表吗?它可能对IEnumerable类型的方法参数感到满意吗?如果ProcessListOfIB方法可以使用IEnumerable而不是List,则使用IEnumerable的方法参数。这种方法不仅可以用于其他集合类型,而且由于IEnumerable中的泛型类型参数,您的问题也将消失。
void ProcessListOfIB(IEnumerable<IB> list)
{
    // Some code
}