объект [] в список <Interface>возвращает ноль - PullRequest
1 голос
/ 09 ноября 2011

Если у меня есть объект, который выглядит следующим образом:

class Person : IProxy
{
    // Properties
}

И у меня есть метод, который возвращает object, который на самом деле List<Person>:

object GetList()
{
    List<Person> people = new List<Person>();

    person.Add(new Person());
    person.Add(new Person());

    return people;
}

Почему следующий код приводит к нулю?

var obj = GetList() as List<IProxy>;

Но приведенный ниже код возвращает список:

var obj = GetList() as List<Person>;

На панели просмотра Visual Studio мой тип отображается как:

object {System.Collections.Generic.List<Person>}

Ответы [ 3 ]

5 голосов
/ 09 ноября 2011

A List<Person> и List<IProxy> - два разных типа, поэтому преобразование одного в другое может привести к нулю.

GetList().OfType<IProxy>()

будет делать то, что вы хотите. Вы также можете использовать

GetList().Cast<IProxy>()

Лично я предпочитаю OfType, потому что он не выдает исключение, когда коллекция содержит гетерогенные типы

Часто задаваемые вопросы о ковариантности и контравариантности может ответить на другие ваши вопросы.

1 голос
/ 09 ноября 2011

Поскольку List<People> отличается от List<IProxy>.Представь, что у тебя было class Cat : IProxy.Если бы вы могли разыграть List<People> до List<IProxy>, вы могли бы добавить к нему Cat, что, я полагаю, вам не нужно.Здесь не хватает общей противоположности, например, в java вы могли бы законно преобразовать свой список в List<? extends IProxy>, что позволило бы вам читать IProxy объектов из списка, но ничего не записывать в него.

0 голосов
/ 09 ноября 2011

Почему тип возврата GetList() object? Было бы разумнее указать List<Person> или IList<Person>. Таким образом, вам не нужно будет выполнять приведение после вызова метода.

Если вы хотите List<IProxy> от вашего метода, вы бы сделали это:

List<IProxy> GetList() 
{ 
    List<IProxy> people = new List<IProxy>(); 

    people.Add(new Person()); 
    people.Add(new Person()); 

    return people; 
} 

1011 * тогда *

var obj = GetList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...