代码之家  ›  专栏  ›  技术社区  ›  MaPi

将IEnumerable强制转换为IList返回空值

  •  4
  • MaPi  · 技术社区  · 8 年前

    我用返回

    IEnumerable<MyEntity>
    

    当我尝试实现结果时,它只在我对结果执行.tolist()时有效,但是如果我尝试

    as IList<MyEntity>
    

    它给出空值。他们不应该产生同样的结果吗?

    2 回复  |  直到 8 年前
        1
  •  4
  •   Patrick Hofman Wahid Bitar    8 年前

    那么您的Enumerable不是实现 IList<T> ,像 List<T> 或者类似的。 as 只要将变量强制转换为指定的类型(如果实例属于该类型)。它不会进行任何转换。

    ToList() 实际上是强迫创造一个新的 列表<t> ,因此在那里创建的新实例实现 i列表<t> .

        2
  •  3
  •   Yan    8 年前

    .ToList() 转换您的 IEnumerable List .
    as IList (试图)铸造你的 IEnumerable(IEnumerable) IList .

    有可能你的 IEnumerable(IEnumerable) 不是一个 伊利斯特 一个简单的例子可以是 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
    

    我们可以看到上面的接口都不是 伊利斯特 .
    编辑: 多亏了 @patrick-hofman 评论,重要的是 check 为了确保这个类不是 伊利斯特 (在这种情况下当然可以)。

    我们可以从中看到 伊利斯特 签名:

    public interface IList<T> : ICollection<T>, IEnumerable<T>, IEnumerable
    

    伊利斯特 是一个 IEnumerable(IEnumerable) 但是 IEnumerable(IEnumerable) 不是 伊利斯特 .