Перечислите<int> в IEnumerable<IComparable>

Я могу неявно привести int к IComparable. Я также могу привести список или массив к IEnumerable.

Но почему я не могу неявно привести Список к IEnumerable?

Я проверил это с помощью.net Framework 4.5 и Visual Studio 2012 Ultimate.

Код для тестирования:

IComparable test1;
int t1 = 5;
test1 = t1; //OK

IEnumerable<int> test2;
List<int> t2 = new List<int>();
int[] t3 = new int[] { 5, 6 };
test2 = t2; //OK
test2 = t3; //OK

TabAlignment[] test;

IEnumerable<IComparable> test3;
test3 = t2; //error Cannot implicitly convert type 'System.Collections.Generic.List<int>' to 'System.Collections.Generic.IEnumerable<System.IComparable>'. An explicit conversion exists (are you missing a cast?)

2 ответа

Решение

Общая дисперсия не относится к типам значений, в основном. Так что пока вы можете

Вам нужно будет указать каждое значение:

IEnumerable<IComparable> test3 = t2.Cast<IComparable>();

Так что пока это действительно так string является ссылочным типом:

List<string> strings = new List<string>();
IEnumerable<IComparable> comparables = strings;

... эквивалент не работает для List<int>, и вам нужно боксировать, как вы идете.

Это общая путаница со списками обобщений, но в целом, если вы обобщите это, это имеет больше смысла:

Рассмотрим эту настройку:

public interface IA{
}

public class A : IA{
}

var listA = new List<A>();

Следующая строка не будет работать:

List<IA> listI = ListA;

По сути это потому, что, хотя A : IA, List<I> does not : List<A> - они совершенно разные типы.

Вы можете сделать бросок достаточно легко, используя Cast метод:

listI = ListA.Cast<IA>();

Так что в вашем случае вы могли бы сделать

test3 = t2.Cast<IComparable>();
Другие вопросы по тегам