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



我有以下内容

    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框架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();
}

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

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

另外,请注意.ToList()不是必需的,因为无论哪种方式,您都应该有IEnumerable<T>

似乎您的lambda表达式返回List<Uri>和您的构造函数期望Func<IEnumerable<Uri>>。编译器可能会混淆你的lambda表达式是什么委托。

试着把你的代码改成这样。

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

相关内容

最新更新