将IEnumerable转换为IList会返回null

时间:2018-05-29 08:18:36

标签: c# linq

我用一个返回

的代码调用我的仓库
IEnumerable<MyEntity>

当我尝试实现结果时,只有当我对结果执行.ToList()时才会有效,但如果我尝试

as IList<MyEntity>

它给出了null。它们不应该产生相同的结果吗?

2 个答案:

答案 0 :(得分:4)

然后,您的枚举不是实现import sys的类型,如IList<T>或类似。如果实例属于该类型,List<T>只是将变量强制转换为指定的类型。它没有进行任何转换。

as实际上强制创建新的ToList(),因此在那里创建的新实例确实实现了List<T>

答案 1 :(得分:3)

.ToList()将您的IEnumerable转换为List as IList(&#34;尝试&#34;)将您的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 修改:感谢@patrick-hofman评论,check整个实施链非常重要,以确保此类不是{{1} (在这种情况下当然可以)。

那就是说,正如我们从IList签名中看到的那样:

IList

public interface IList<T> : ICollection<T>, IEnumerable<T>, IEnumerable IList,但IEnumerable不是IEnumerable