В Silverlight 4.0 отсутствует поддержка языка C # 4.0? - PullRequest
0 голосов
/ 05 марта 2011

Приведенный ниже код компилируется с .Net Framework 4.0, но не с Silverlight 4.0.Буду признателен, если кто-нибудь сможет пролить свет на это.Вот сообщения об ошибках, которые я получаю:

Error   1   The best overloaded method match for 'ThinkFarAhead.Confounded.Client.Models.Consumer.SetFunctionalAreas(System.Collections.Generic.IEnumerable<ThinkFarAhead.Confounded.Client.Models.IFunctionalArea>)' has some invalid arguments    c:\Hanu\SilverlightApplication1\Test.cs 64  13  SilverlightApplication1
Error   3   The best overloaded method match for 'ThinkFarAhead.Confounded.Client.Models.Consumer.SetFunctionalAreas(System.Collections.Generic.IEnumerable<ThinkFarAhead.Confounded.Client.Models.IFunctionalArea>)' has some invalid arguments    c:\Hanu\SilverlightApplication1\Test.cs 65  13  SilverlightApplication1
Error   2   Argument 1: cannot convert from 'ThinkFarAhead.Confounded.Web.EntitySet<ThinkFarAhead.Confounded.Web.FunctionalArea>' to 'System.Collections.Generic.IEnumerable<ThinkFarAhead.Confounded.Client.Models.IFunctionalArea>'   c:\Hanu\SilverlightApplication1\Test.cs 64  47  SilverlightApplication1
Error   4   Argument 1: cannot convert from 'ThinkFarAhead.Confounded.Web.EntitySet<ThinkFarAhead.Confounded.Web.FunctionalArea>' to 'System.Collections.Generic.IEnumerable<ThinkFarAhead.Confounded.Client.Models.IFunctionalArea>'   c:\Hanu\SilverlightApplication1\Test.cs 65  47  SilverlightApplication1

Что я пытаюсь сделать: Расширить сгенерированные объекты (RIA) на стороне Silverlight (4.0), чтобы несколько объектов с общими функциями совместно использовали один и тот жеинтерфейс (элемент управления должен использовать несколько объектов одинаково. Эти объекты практически одинаковы).

Заранее спасибо.

using System;
using System.Collections;
using System.Collections.Generic;
using ThinkFarAhead.Confounded.Client.Models;
using ThinkFarAhead.Confounded.Web;


namespace ThinkFarAhead.Confounded.Web
{

    public class Entity { }

    public class EntitySet<T> : IEnumerable<T>, IEnumerable where T : Entity
    {
        List<T> list = new List<T>();
        public IEnumerator<T> GetEnumerator()
        {
            return (IEnumerator<T>)list;
        }

        IEnumerator IEnumerable.GetEnumerator()
        {
            return GetEnumerator();
        }

        public void Add(T newone)
        {
            list.Add(newone);
        }
    }

    public partial class FunctionalArea : Entity
    {
        public string Name { get; set; }
    }

    public partial class FunctionalArea : IFunctionalArea { }

}

namespace ThinkFarAhead.Confounded.Client.Models
{


    public interface IFunctionalArea
    {
        string Name { get; set; }
    }


    public class Variance
    {
        public static EntitySet<FunctionalArea> FunctionalAreas
        {
            get
            {
                return new EntitySet<FunctionalArea>();
            }
        }

        public static void Main()
        {
            var abc = new EntitySet<FunctionalArea>();
            new Consumer().SetFunctionalAreas(abc);
            new Consumer().SetFunctionalAreas(FunctionalAreas);
        }
    }

    public class Consumer
    {

        public void SetFunctionalAreas(IEnumerable<IFunctionalArea> areas)
        {
        }
    }
}

Ответы [ 2 ]

1 голос
/ 05 марта 2011

Как сказал Остин в SL4, вы не можете просто передать свою коллекцию с типом IEnumerable<FunctionalArea> в качестве параметра, когда ваш метод ожидает IEnumerable<IFunctionalArea>.

Но если вы не хотите использовать «динамический», не забывайте, что вы все еще можете сделать это (используя System.Linq):

var abc = new EntitySet<FunctionalArea>();
new Consumer().SetFunctionalAreas(abc.Cast<IFunctionalArea>());
new Consumer().SetFunctionalAreas(FunctionalAreas.Cast<IFunctionalArea>());

Не совсем элегантно, но эй, вот и все;)

1 голос
/ 05 марта 2011

BCL в Silverlight не имеют ковариантных / контравариантных маркеров (IEnumerable<T> не помечен как IEnumerable<out T>, как, например, в .NET Framework).

Пользовательский код может использовать эти функции, это не просто код платформы, а ограничение платформы на сегодняшний день.

...