Строго типизированная коллекция Неявное и явное приведение - PullRequest
1 голос
/ 04 декабря 2011
public void Foo (IEnumerable<object> objects)
{
}

var strings = new List<string>{"first", "second", "third"};
Foo(strings); // Compilation Error.
Foo(strings.Cast<object>()); // O.k.
  1. Почему первый вызов Foo не компилируется?строка, полученная из объекта.
  2. Если я могу привести список к объекту, и он скомпилирован, почему компилятор не делает это самостоятельно?

Ответы [ 3 ]

4 голосов
/ 04 декабря 2011

Первый вызов компилируется в .NET 4.0.

В предыдущих версиях универсальные типы должны точно соответствовать .

Предлагаю прочитать сообщения Эрика в блогах.Липперт относительно дисперсии (ковариации и контравариантности).

0 голосов
/ 04 декабря 2011

Вы не хотите искать ко-дисперсия и контр-дисперсия .

Это новая функция в .NET 4.0

0 голосов
/ 04 декабря 2011
  1. Обобщения являются строгими в том смысле, что вы не можете назначить коллекцию производного типа коллекции супертипа. Вы должны указать точный тип, используемый для создания экземпляра коллекции.
  2. Потому что он не может знать, что ты хочешь делать. По той же причине, по которой следующая строка не компилируется:

    string s = new object();
    

Принудительное приведение типа «небезопасного» к пользователю было бы слишком большой свободой, предоставленной компилятору.

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