В Chrome вы можете сфокусировать консоль DevTools с помощью сочетания клавиш Control + ` kbd> (control и backtick).
У Google есть документация, в которой перечислены все доступные сочетания клавиш для Chrome DevTools здесь: https://developers.google.com/web/tools/chrome-devtools/shortcuts
Ваш List<Foo>
не подкласс если List<IFoo>
потому что Вы не можете сохранить MyOwnFoo
объект в нем, который также, оказывается, IFoo
реализация. (Принцип замены Лисков)
Идея сохранить a List<IFoo>
вместо специализированного List<Foo>
в порядке. При необходимости в кастинге содержания списка к, он - тип реализации, это, вероятно, означает, что интерфейс не является соответствующим.
КРУПНОЕ РЕДАКТИРОВАНИЕ
Вы сможете сделать это с 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
}
Вот пример того, почему Вы не можете сделать этого:
// 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 там будет ограничен поддержка этого (это назвало различие), но это все еще не будет поддерживать этот конкретный сценарий по точно причинам, приведенным выше.
В Вашей функции возврата необходимо составить список список интерфейсов, и когда Вы создаете объект, сделайте его как объект, который реализует его. Как это:
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; }
Простой ответ - это List<Foo>
другой тип к List<IFoo>
, таким же образом это DateTime
отличается от IPAddress
, например.
Однако то, что Вы имеете IFoo
подразумевает это наборы IFoo
как ожидают, будут содержать по крайней мере две реализации IFoo
(FooA
, FooB
, и т.д....), потому что, если Вы ожидаете там к только когда-нибудь быть одной реализацией IFoo
, Foo
, затем IFoo
тип избыточен.
Так, если там только когда-либо будет одним производным типом интерфейса, забудьте интерфейс и экономьте на издержках. Если существует два или больше производных типа интерфейса, затем всегда используют интерфейсный тип в параметрах наборов / универсальных параметрах.
Если Вы пишете преобразовывающий код затем где-нибудь существует, вероятно, недостаток дизайна.