Почему я не могу возвратить Список <Нечто>, если спросили относительно Списка <IFoo>? [дубликат]

В Chrome вы можете сфокусировать консоль DevTools с помощью сочетания клавиш Control + ` kbd> (control и backtick).

У Google есть документация, в которой перечислены все доступные сочетания клавиш для Chrome DevTools здесь: https://developers.google.com/web/tools/chrome-devtools/shortcuts

7
задан Joel in Gö 25 November 2008 в 13:36
поделиться

5 ответов

Ваш List<Foo> не подкласс если List<IFoo> потому что Вы не можете сохранить MyOwnFoo объект в нем, который также, оказывается, IFoo реализация. (Принцип замены Лисков)

Идея сохранить a List<IFoo> вместо специализированного List<Foo> в порядке. При необходимости в кастинге содержания списка к, он - тип реализации, это, вероятно, означает, что интерфейс не является соответствующим.

14
ответ дан 6 December 2019 в 05:06
поделиться

КРУПНОЕ РЕДАКТИРОВАНИЕ Вы сможете сделать это с C# 4.0, но [благодарит Jon]

Можно обойти его использование ConvertAll:

public List<IFoo> IFoos()
{
    var x = new List<Foo>(); //Foo implements IFoo
    /* .. */
    return x.ConvertAll<IFoo>(f => f); //thanks Marc
}
5
ответ дан 6 December 2019 в 05:06
поделиться

Вот пример того, почему Вы не можете сделать этого:

// Suppose we could do this...
public List<IDisposable> GetDisposables()
{
    return new List<MemoryStream>();
}

// Then we could do this
List<IDisposable> disposables = GetDisposables();
disposables.Add(new Form());

В той точке список, который был создан для содержания MemoryStreams теперь, имеет Форму в нем. Плохо!

Так в основном это ограничение присутствует для поддержания безопасности типов. В C# 4 и.NET 4.0 там будет ограничен поддержка этого (это назвало различие), но это все еще не будет поддерживать этот конкретный сценарий по точно причинам, приведенным выше.

12
ответ дан 6 December 2019 в 05:06
поделиться

В Вашей функции возврата необходимо составить список список интерфейсов, и когда Вы создаете объект, сделайте его как объект, который реализует его. Как это:

function List<IFoo> getList()
{
  List<IFoo> r = new List<IFoo>();
  for(int i=0;i<100;i++)
      r.Add(new Foo(i+15));

  return r;
}
8
ответ дан 6 December 2019 в 05:06
поделиться

Простой ответ - это List<Foo> другой тип к List<IFoo>, таким же образом это DateTime отличается от IPAddress, например.

Однако то, что Вы имеете IFoo подразумевает это наборы IFoo как ожидают, будут содержать по крайней мере две реализации IFoo (FooA, FooB, и т.д....), потому что, если Вы ожидаете там к только когда-нибудь быть одной реализацией IFoo, Foo, затем IFoo тип избыточен.

Так, если там только когда-либо будет одним производным типом интерфейса, забудьте интерфейс и экономьте на издержках. Если существует два или больше производных типа интерфейса, затем всегда используют интерфейсный тип в параметрах наборов / универсальных параметрах.

Если Вы пишете преобразовывающий код затем где-нибудь существует, вероятно, недостаток дизайна.

0
ответ дан 6 December 2019 в 05:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: