加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 07:46:51 所属栏目:百科 来源:网络整理
导读:我有两个问题: 问题1背景: 我注意到在Microsoft的LINQ中查看’AsEnumerable()’方法的实现时,它是: public static IEnumerableTSource AsEnumerableTSource(this IEnumerableTSource source){ return source;} 问题1: 我期待某种铸造或某种东西在这里,但
我有两个问题:

问题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>类型的变量.我想你在这里反思;列表与LT;炭>派生自IEnumerable< char>,而不是相反.这与List< T>无关.不变的. IEnumerable的< T>是协变的(更确切地说,类型参数T是协变的),这给了我们这种情况:
IEnumerable enumerable = Enumerable.Empty<string>(); // Allowed
IEnumerable<string> genericEnumerable = enumerable; // Not allowed

>再次,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" };

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读