Почему список интерфейсов не может использовать реализующий тип?

Должно быть что-то фундаментальное в интерфейсах / дженериках, которых я еще не изучил. Я надеюсь узнать это сейчас.

Вот сценарий:

У меня есть этот интерфейс и класс:

public interface IInterface
{
    string TestValue { get; set; }
}

public class RealValue: IInterface
{
    public string TestValue { get; set; }
}

Если я создам такой метод, он отлично компилируется:

public class RandomTest: IMethodInterface
{
   public IInterface GetRealValue()
   {
       RealValue realValue = new RealValue();
       return realValue;
   }
 }

Обратите внимание, что я возвращаю объект, реализующий интерфейс.

] Теперь, если я добавлю к классу RandomTest метод, возвращающий список, он больше не будет работать:

 public List<IInterface> GetRealValues()
 {
    List<RealValue> realValues = new List<RealValue>();
    return realValues;  // ERROR Here <- says it can't convert to a List<IInterface>
 }

Итак, я предполагаю, что дженерики не могут это понять, но почему?

Есть ли способ обойти это? Что вы делаете, когда возвращаемое значение метода выше заблокировано, потому что вы реализуете такой интерфейс:

public interface IMethodInterface
{
    IInterface GetRealValue();
    List<IInterface> GetRealValues(); // Can't just convert the return types to a concrete 
                                      // class because I am implementing this.  This 
                                      // interface is in a separate project that does not 
                                      // have the concrete classes.
}

Есть ли надежда? Что бы вы сделали?

7
задан Vaccano 31 October 2010 в 07:06
поделиться