Дженерики Monodroid не ковариантны? - PullRequest
2 голосов
/ 10 января 2012

EDIT: Кажется, подтверждается, что ковариантные дженерики еще не поддерживаются. Чтобы сделать это в следующем выпуске, напишите Xamarin и запросите эту функцию.

Следующий код выдает ошибку (в операторе linq). Идентичный код отлично работает в Microsoft clr c # 4.0.

Ошибка:

Cannot implicitly convert type 'System.Collections.Generic.IEnumerable<LinqTest.Person>' to 'System.Collections.Generic.IEnumerable<LinqTest.Entity>'. An explicit conversion exists (are you missing a cast?)

Код:

[Activity(Label = "LinqTest", MainLauncher = true, Icon = "@drawable/icon")]
public class Activity1 : Activity {

    protected override void OnCreate(Bundle bundle) {
        base.OnCreate(bundle);

        var names = new List<string> {
                                         "Joe",
                                         "Bob",
                                         "Jim",
                                         "Jane"
                                     };

        IEnumerable<Entity> query =
            from e in names
            select new Person() {Name = e};

        SetContentView(Resource.Layout.Main);

        var button = FindViewById<Button>(Resource.Id.MyButton);

        button.Click += delegate {
                            button.Text = string.Format("{0}", query.Count());
                        };
    }
}

public class Entity {
    public string Name { get; set; }
}

public class Person : Entity {
    public string Workplace { get; set; }
}

public class Animal : Entity {
    public string FurColour { get; set; }
}

Я прав или я что-то упустил? Если да, то рекомендации по рефакторингу это?

Также, если это так, считайте это официальным запросом функции для monodroid - поддержка ковариантной универсальной поддержки. :)

Спасибо.

Ответы [ 3 ]

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

Ни MonoTouch, ни Mono для Android не поддерживают ковариацию прямо сейчас. Он будет поддерживаться в следующем выпуске (возможно, во второй половине этого года).

0 голосов
/ 14 января 2012

Отсутствие ковариантной поддержки обобщений приводило к уродливому коду, поэтому я вернулся к этой проблеме и придумал простой способ взломать симулированный ковариантный эффект.

Я хотел бы получить любые отзывы о том, как сделать это еще проще. Также я беспокоюсь о производительности - любые мысли. Это все еще не идеально, но позволяет мне очистить другой код.

Вот новый пример кода, который имитирует ковариантные генерики на монодроиде.

    [Activity(Label = "CovariantTest", MainLauncher = true, Icon = "@drawable/icon")]
public class Activity1 : Activity {
    int count = 1;

    protected override void OnCreate(Bundle bundle) {
        base.OnCreate(bundle);

        SetContentView(Resource.Layout.Main);

        Button button = FindViewById<Button>(Resource.Id.MyButton);

        var names = new List<string> {
                                         "Joe",
                                         "Bob",
                                         "Jim",
                                         "Jane"
                                     };

        IEnumerable<Entity>query =
            (from e in names
            select (new Person() { Name = e }) as Entity).ToList();

        Person p =  query[2] as Person;

        button.Click += delegate { button.Text = string.Format("{0}", p.Test()); };
    }
}

public class Entity {
    public string Name { get; set; }
}

public class Person : Entity {
    public string Workplace { get; set; }
    public string Test() {
        return "I am a person";
    }
}

public class Animal : Entity {
    public string FurColour { get; set; }
}
0 голосов
/ 10 января 2012

Разве вы не забыли установить версию фреймворка на 4.0?У меня работает с Mono 2.10.8.Хотя это также может быть определенным ограничением для Android (частичная общая поддержка указана здесь , однако явно не указана).

...