将继承的接口传递给方法

时间:2009-09-08 20:34:03

标签: c# interface

我有以下界面:

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>

如果我只尝试传递一个实例,而不是列表,那么它正在工作,那么我在这里缺少什么?

谢谢,

4 个答案:

答案 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
    {
    }