我有以下界面:
public interface IBase
{
int id1 { get; set; }
}
public interface IDerived : IBase
{
int id2 { get; set; }
}
以下(样本)计划:
class Program
{
static void Main(string[] args)
{
IList<IDerived> derived = null;
Check(derived);
}
static void Check(IList<IBase> base)
{
}
}
我收到了这个恭维错误:
无法从“System.Collections.Generic.IList<IDerived>
”转换为“System.Collections.Generic.IList<IBase>
”
如果我只尝试传递一个实例,而不是列表,那么它正在工作,那么我在这里缺少什么?
谢谢,
答案 0 :(得分:3)
这是由于C#3中的接口类型缺乏协方差,C#4将允许您指定接口类型的协方差和逆变。
不幸的是,这是其中一种不能按照您认为应该在C#3中运行的方式之一。
答案 1 :(得分:3)
您需要将IList项目转换为IBase。以下是使用Linq扩展的示例:
Check(derived.Cast<IBase>());
答案 2 :(得分:2)
IList<IDerived>
的实例不是IList<IBase>
的实例。首先,您无法在其上调用.Add(new ConcreteBase())
。 (其中ConcreteBase
实现IBase
)
答案 3 :(得分:0)
然而这会起作用......
static void Main(string[] args)
{
List<IDerived> derived = null;
Check(derived.ToArray());
}
static void Check(IBase[] asdf)
{
}
我更喜欢raw array []或IEnumerable&lt;&gt;的几个原因之一对于参数和返回值的接口。但如果您更喜欢使用List / IList,您仍然可以执行以下操作:
static void Main(string[] args)
{
IList<IDerived> derived = null;
Check(derived);
}
static void Check<T>(IList<T> asdf) where T : IBase
{
}