无法将lambda表达式转换为System.Collections.Generic.ICollection <tobject>类型,因为它不是委托类型</tobject>

时间:2014-06-24 16:37:52

标签: c# visual-studio-2010 lambda

我有以下

    public AttributeCollection(string objectUrn) : this(new Uri(objectUrn)) { }
    public AttributeCollection(Uri objectUrn) : base(() => Service.FindAllByObjectUrn(objectUrn).ToList())       
    {
        ObjectUrn = objectUrn;
    }

lambda在主题中抛出错误。奇怪的是,在从Visual Studio 2008转换到Visual Studio 2010之前,代码编译得很好。它仍然以.NET framework 3.5为目标。我不明白从迁移到2010年可能会发生什么变化会影响到这一点。有什么指针吗?

修改 基类如下所示:

[Serializable]
public abstract class OneToManyCollection<T> : ICollection<T>, IEnumerable<T>, IEnumerable, ISerializable
{
    public OneToManyCollection();
    public OneToManyCollection(Func<IEnumerable<T>> lazyLoader);
    public OneToManyCollection(ICollection<T> items);
    public OneToManyCollection(SerializationInfo info, StreamingContext context);

    protected virtual ICollection<T> Added { get; }
    public virtual int Count { get; }
    public virtual bool IsDirty { get; }
    public virtual bool IsReadOnly { get; }
    protected virtual ICollection<T> Items { get; }
    protected virtual ICollection<T> Removed { get; }

    public virtual void Add(T newItem);
    public virtual void Clear();
    protected virtual void ClearIsDirty();
    public virtual bool Contains(T item);
    public virtual void CopyTo(T[] array, int arrayIndex);
    public IEnumerator<T> GetEnumerator();
    public void GetObjectData(SerializationInfo info, StreamingContext context);
    public virtual bool Remove(T oldItem);
    public abstract void Save();
}

2 个答案:

答案 0 :(得分:0)

您可能只需要告诉C#您的lambda的类型是什么(您必须将T更改为实际类型):

public AttributeCollection(Uri objectUrn) :
    base((Func<IEnumerable<T>>)
         (() => Service.FindAllByObjectUrn(objectUrn).ToList()))
{
    ObjectUrn = objectUrn;
}

另请注意,.ToList()不是必需的,因为您应该有IEnumerable<T>

答案 1 :(得分:0)

看来你的lambda expresion返回List<Uri>,你的构造函数需要Func<IEnumerable<Uri>>。编译器可能会混淆委托lambda表达式的内容。

尝试将代码更改为此。

    public AttributeCollection(Uri objectUrn) : base(new Func<IEnumerable<Uri>>(() => Service.FindAllByObjectUrn(objectUrn).ToList()))       
    {
        ObjectUrn = objectUrn;
    }