以下代码使用.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)
{
}
}
}
答案 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>());
不太优雅,但嘿,这就是诀窍;)