在LINQ中内部实现AsEnumerable()

我有两个问题:

问题1背景:我注意到当从Microsoft看LINQ中'AsEnumerable()'方法的实现时,它是:

public static IEnumerable<TSource> AsEnumerable<TSource>(this IEnumerable<TSource> source)
{ 
   return source;
} 

问题1:我在这里期待某种投射或某种东西,但它只是返回它传递的值。 这个怎么用 ?

问题2/3背景:我一直在试图理解协变性,逆变和不变。 我认为,我有一种模糊的理解,即“in”和“out”关键字决定了将子类型分配给父类型时的多态行为。

问题2:从阅读中我知道IEnumerable是协变的,而List是不变的,那么为什么这是不可能的:

List<char> content = "testString".AsEnumerable();

问题3:
如果IList实现IEnumerable,那么为什么这是不可能的:

IEnumerable<char> content1 = "testString";
IList<char> content2 = content1;

请帮助我理解,提前谢谢。


  • 输入参数已知具有IEnumerable<TSource>类型。 为什么它需要投什么东西? 将对象转换为TSource类型将不起作用,因为它们已确保为该类型(或更多派生类型)。

  • 您不能将类型为IEnumerable<char>的值赋给List<char>类型的变量。 我想你在这里倒过来想。 List<char>IEnumerable<char> List<char>派生,而不是相反。 这与List<T>是不变的无关。 IEnumerable<T>是协变的(更确切地说,类型参数T是协变的),这给了我们这种情况:

    IEnumerable enumerable = Enumerable.Empty<string>(); // Allowed
    IEnumerable<string> genericEnumerable = enumerable; // Not allowed
    
  • 再次, IList<char>IEnumerable<char> IList<char>继承,而不是相反。 你可以这样做:

    IList<char> content1 = "testString".ToList();
    IEnumerable<char> content2 = content1;
    

    恐怕你要求的东西没有意义,这与协变性无关。 IEnumerable<T>是协变的事实意味着你可以这样做:

    IEnumerable<object> asObject = new List<string>() { "test" };
    

    List<T>是不变的,所以你不能这样做:

    List<object> asObject = new List<string>() { "test" };
    
  • 链接地址: http://www.djcxy.com/p/14891.html

    上一篇: Internal Implementation of AsEnumerable() in LINQ

    下一篇: Slow Dynamic GSP Reloading in Production on AIX