gpt4 book ai didi

c# - LINQ 中 AsEnumerable() 的内部实现

转载 作者:太空狗 更新时间:2023-10-29 19:44:08 24 4
gpt4 key购买 nike

我有两个问题:

问题 1 背景:在查看 Microsoft LINQ 中“AsEnumerable()”方法的实现时,我注意到:

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

问题 1:我在这里期待某种类型的转换或其他东西,但它只是返回它传递的值。这是如何运作的 ?

问题 2/3 背景:我一直在努力理解 Covariance 、 contravariance 和 Invariant 。我想,我有一个模糊的理解,即“in”和“out”关键字决定了将子类型分配给父类型时的多态行为。

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

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

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

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

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

最佳答案

  1. 已知输入参数的类型为 IEnumerable<TSource> .为什么它需要转换任何东西?将对象转换为类型 TSource不会有任何影响,因为它们已经保证是那种类型(或更派生的类型)。

  2. 您不能分配 IEnumerable<char> 类型的值到 List<char> 类型的变量.我认为您在这里的想法是相反的; List<char>源自 IEnumerable<char> ,而不是相反。这与List<T>无关是不变的。 IEnumerable<T>是协变的(更准确地说,类型参数 T 是协变的),这给了我们这种情况:

    IEnumerable enumerable = Enumerable.Empty<string>(); // Allowed
    IEnumerable<string> genericEnumerable = enumerable; // Not allowed
  3. 再次,IList<char>继承自 IEnumerable<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" };

关于c# - LINQ 中 AsEnumerable() 的内部实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17972244/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com