返回列表中的具体实现

时间:2011-09-22 08:34:54

标签: list interface implementation abstraction

我知道这不会编译,但为什么不应该编译?

public interface IReportService {
  IList<IReport> GetAvailableReports();
  IReport GetReport(int id);
}

public class ReportService : IReportService {
 IList<IReport> GetAvailableReports() {
   return new List<ConcreteReport>(); // This doesnt work
 }

 IReport GetReport(int id){
   return new ConcreteReport(); // But this works
 }
}

3 个答案:

答案 0 :(得分:0)

尝试更改此

IList<? extends IReport> GetAvailableReports()

答案 1 :(得分:0)

这是因为covariance。您可以在.NET 4中使用它(阅读链接)。

答案 2 :(得分:0)

我最近遇到了这个问题,并发现使用IEnumerable而不是List解决了这个问题。这是一个非常令人沮丧的问题,但一旦我找到问题的根源,它就有意义了。

以下是我用来找到解决方案的测试代码:

using System.Collections.Generic;

namespace InheritList.Test
{
    public interface IItem
    {
        string theItem;
    }

    public interface IList
    {
        IEnumerable<IItem> theItems; // previously has as list... didn't work.
                                     // when I changed to IEnumerable, it worked.
        public IItem returnTheItem();
        public IEnumerable<IItem> returnTheItemsAsList();
    }

    public class Item : IItem
    {
        string theItem;
    }

    public class List : IList
    {
        public IEnumerable<IItem> theItems; // List here didn't work - changed to IEnumerable

        public List()
        {
            this.theItems = returnTheItemsAsList();
        }
        public IItem returnTheItem()
        {
            return new Item();
        }

        public IEnumerable<IItem> returnTheItemsAsList()
        {
            var newList = new List<Item>();
            return newList;
        }
    }
}