Silverlight 4.0缺少C#4.0语言支持?

时间:2011-03-05 03:31:22

标签: silverlight-4.0 c#-4.0

以下代码使用.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

我正在尝试做什么: 在Silverlight(4.0)端扩展生成的实体(RIA)以使具有共同特征的多个实体共享相同的接口(控件需要以相同的方式使用多个对象。这些对象几乎相同)。

提前致谢。

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 个答案:

答案 0 :(得分:1)

Silverlight中的BCL没有协变/逆变标记(例如,IEnumerable<T>未标记为IEnumerable<out T>,如.NET Framework中所示。

用户代码可以使用这些功能,它只是框架代码而不是 - 当今平台的限制。

答案 1 :(得分:1)

正如Austin在SL4中所说,当您的方法需要IEnumerable<FunctionalArea>时,您不能只使用IEnumerable<IFunctionalArea>类型作为参数传递您的收藏。

但是如果你不想“动态”,不要忘记你仍然可以这样做(使用System.Linq):

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

不太优雅,但嘿,这就是诀窍;)