C# 实现接口B Can'的接口D列表;不能被视为列表<;B>;
我有一个接口ID,它是从另一个接口IB派生的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) { //
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
}