Вернуть конкретную реализацию в списке - PullRequest
0 голосов
/ 22 сентября 2011

Я знаю, что это не компилируется, но почему это не нужно?

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 голосов
/ 05 октября 2011

Это из-за ковариации .Вы можете заставить его работать в .NET 4 (читайте по ссылке).

0 голосов
/ 29 ноября 2013

Недавно я сам столкнулся с этой проблемой и обнаружил, что использование 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;
        }
    }
}
0 голосов
/ 22 сентября 2011

Попробуйте изменить это

IList<? extends IReport> GetAvailableReports()
...