无法将lambda表达式转换为类型System.Collections.Generic.ICollection< obj
本文关键字:Collections System Generic ICollection obj 类型 lambda 表达式 转换 | 更新日期: 2023-09-27 18:10:10
我有以下内容
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;
}