Linq如何帮助使用持有List <t>对象的IList <t>引用中的List <t>类的方法?

时间:2019-04-18 11:21:50

标签: c# list linq

仅通过包含行ToArray(),就可以从List<T>接口的引用中调用IList<T>类的using System.Linq方法。但是,如果没有Linq命名空间,代码将显示错误消息,“ IList接口中没有这样的方法”。

将C#与.NET Core一起使用。

IList<int> l = new List<int>();
...

int[] arr = (int[])l.ToArray(typeof(int));

2 个答案:

答案 0 :(得分:0)

我找不到带有参数的ToArray()

此代码:

int[] arr =l.ToArray();
int[] arr2 = (int[])l.ToArray();

等效于此:

int[] array = Enumerable.ToArray(l);
int[] array2 = Enumerable.ToArray(l);

IL代码:插入IL_0008IL_000f的部分


IL_0000: nop
IL_0001: newobj instance void class [mscorlib]System.Collections.Generic.List`1<int32>::.ctor()
IL_0006: stloc.0
IL_0007: ldloc.0
IL_0008: call !!0[] [System.Core]System.Linq.Enumerable::ToArray<int32>(class [mscorlib]System.Collections.Generic.IEnumerable`1<!!0>)
IL_000d: stloc.1
IL_000e: ldloc.0
IL_000f: call !!0[] [System.Core]System.Linq.Enumerable::ToArray<int32>(class [mscorlib]System.Collections.Generic.IEnumerable`1<!!0>)
IL_0014: stloc.2
IL_0015: ret

在其上使用F1将带您到MSDN文档:
https://docs.microsoft.com/en-us/dotnet/api/system.linq.enumerable.toarray?view=netframework-4.7.2

指出它在名称空间中: System.Linq

IList仅提供以下方法:

Add(Object)
Clear()
Contains(Object)
CopyTo(Array, Int32)
GetEnumerator()继承自ICollection
IndexOf(Object)继承自IEnumerable
Insert(Int32, Object)
Remove(Object)
RemoveAt(Int32)


SharpLab demo查看代码编译的中间步骤和结果。

答案 1 :(得分:0)

如评论中所述,ToArray()是可在System.Linq命名空间中的IList上使用的扩展方法。

IList没有此功能,而List有此功能的原因。是因为List类定义了ToArray()方法,而IList没有定义。这将解释IList.ToArray()上的错误

https://docs.microsoft.com/en-us/dotnet/api/system.collections.generic.list-1.toarray?view=netframework-4.7.2