我正在调用一个代码仓库,该代码返回一个
当我试图将结果实例化时,只有在结果上执行.ToList()才有效,但如果我尝试一个就不行了。
它返回null。它们不应该产生相同的结果吗?
IEnumerable<MyEntity>
当我试图将结果实例化时,只有在结果上执行.ToList()才有效,但如果我尝试一个就不行了。
as IList<MyEntity>
它返回null。它们不应该产生相同的结果吗?
.ToList()
将你的IEnumerable
转换为List
。
as IList
("尝试")将你的IEnumerable
强制转换为IList
。
有可能你的IEnumerable
根本不是IList
,一个简单的例子可能是class Dictionary
:
public class Dictionary<TKey, TValue> : IDictionary<TKey, TValue>,
ICollection<KeyValuePair<TKey, TValue>>, IEnumerable<KeyValuePair<TKey, TValue>>,
IEnumerable, IDictionary, ICollection, IReadOnlyDictionary<TKey, TValue>,
IReadOnlyCollection<KeyValuePair<TKey, TValue>>, ISerializable,
IDeserializationCallback
IList
。IList
(在这种情况下当然可以)。
话虽如此,从IList
的签名中我们可以看到:
public interface IList<T> : ICollection<T>, IEnumerable<T>, IEnumerable
IList
是IEnumerable
,但IEnumerable
不是IList
。
IDictionary<TKey, TValue>
没有实现IList<T>
呢? - Patrick Hofman
ToList
是一个方法,它枚举整个序列并将每个项添加到新的列表中,而as IList<T>
只是将可枚举对象强制转换为所需类型,这当然会失败,因为它不是一个IList<T>
而只是一个查询。 - Tim SchmelterToList
将源转换为List
,因此可以检索数据,但如果源不是IList
,则IList
将失败。如果要实现结果的物化,应调用任何具有To[whatever]
的方法以强制检索。 - CleptusIEnumerable<MyEntity>
的Type
是什么,HashSet
还是DbSet
?尝试使用as ISet<MyEntity>
替换as IList<MyEntity>
。 - Brett Caswell