Неверное отклонение - PullRequest
1 голос
/ 11 января 2012

У меня есть следующее определение интерфейса:

public interface IResEnume<out TModel> : IEnumerable<TModel> where TModel : IModel
{
}

, где IModel -

public interface IModel
{
    int Id { get; }
}

Это прекрасно работает, когда целевой платформой является .NET 4.

Iпытаюсь портировать библиотеку классов на Windows Phone 7.1.

При этом я получаю следующую ошибку:

Недопустимая дисперсия: параметр типа 'TModel' должен быть неизменно действительным> на «System.Collections.Generic.IEnumerable».TModel является ковариантным.

Если я удаляю 'out', эта строка компилируется, но затем я получаю ошибку в другом месте.

1 Ответ

3 голосов
/ 11 января 2012

Это связано с тем, что параметр T в IEnumerable<T> не является ковариантным в Silverlight. Для удобства MSDN говорит, что является ковариантным, однако в контенте сообщества кто-то еще указывает на то же самое:

Несмотря на приведенную выше документацию, параметр общего типа T в Silverlight не выглядит ковариантным.

Мы можем проверить это в Обозревателе объектов. В .NET Framework 4:

.NET 4

Обратите внимание, что объявление типа содержит out.

А для Windows Phone 7:

Silverlight

В Windows Phone IEnumerable нет out. Вы не можете объявить TModel ковариант, потому что IEnumerable<T> не гарантирует, что это ковариант. Нет причины, по которой это не могло быть; Microsoft просто нужно обновить его.

РЕДАКТИРОВАТЬ : После некоторых копаний похоже, что это известная проблема в Microsoft Connect, помеченная как «исправленная». Вероятно, это было исправлено в Silverlight 5; который Windows Phone еще не использует.

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