MonoTouch и поддерживающие варианты универсальных интерфейсов

Приведенный ниже пример отлично компилируется в обычном Mono 2.10.9:

namespace covarianttest
{
    public interface ITest<out T> : IEnumerable<T>
    {
    }
}

Однако, когда я пытаюсь скомпилировать его с MonoTouch 6.0.8, я получаю эту ошибку:

Ошибка CS1961: параметр ковариантного типа «T» должен быть инвариантно действительным в «covarianttest.ITest».

Итак, я предполагаю, что MonoTouch еще не поддерживает расширение ковариантных/контравариантных универсальных интерфейсов? Если да, то каков рекомендуемый обходной путь для этой ситуации в MonoTouch?


person Rodney S. Foley    schedule 30.12.2012    source источник


Ответы (1)


На самом деле это зависит от компилятора (и профиля/среды выполнения), а не от версии Mono. IOW некоторые вещи могут работать на Mono 2.10 и не работать с MonoTouch 6.x.

Текущие версии MonoTouch поставляются с компилятором smcs и профилем на основе 2.1 (в основном Silverlight и некоторыми дополнениями .NET 4.0).

Для новых функций, таких как ковариация, требуется полный компилятор версии 4.0 (например, dmcs в Mono 2.10 или mcs в Mono 3.0) и среда выполнения.

Будущие версии MonoTouch (вероятно, этой весной с альфа- и бета-версиями в начале 2013 года) будут предоставлять среду выполнения 4.0/4.5 и компилятор.

person poupou    schedule 30.12.2012
comment
Итак, вы говорите, что MonoTouch не поддерживает Co/Contra-вариантность в настоящее время, и это может когда-нибудь исправиться в будущем? - person Rodney S. Foley; 30.12.2012
comment
Да, большинство функций .NET/CLR 4.x пока недоступны в MonoTouch, но они станут доступны после того, как MT будет перебазирован на Mono 3.0 (и новый компилятор mcs). - person poupou; 30.12.2012
comment
Плохо, что это не было исправлено в новом релизе. Я написал WPF-подобную структуру, которая использует привязки, и я не могу использовать IEnumerable<Object>, что плохо, я должен использовать IEnumerablenow. Но гораздо более раздражает, когда вы хотите использовать другой тип, чем Object. - person Felix K.; 03.03.2013