'as dynamic[]' 和 ToArray() 之间的区别

Difference between 'as dynamic[]' and ToArray()

我正在重构一些代码,让 ReSharper 帮我解决了一些问题。我得到了这段代码:

IEnumerable<dynamic> records = ...;
ScheduleTemplateInfo[] resultTemplateInfos = new ScheduleTemplateInfo[records.Count()];

这里他警告我可能会有一个Possible multiple enumeration of IEnumerable。所以我让 ReSharper 重构,他给了我这个:

IEnumerable<dynamic> records = ...;
dynamic[] recordsAsArray = records as dynamic[] ?? records.ToArray();
ScheduleTemplateInfo[] resultTemplateInfos = new ScheduleTemplateInfo[recordsAsArray.Length];

现在,我想乍一看确实更有效率。但是,我对插入的第二行感到好奇。

录制唱片as dynamic[]和制作唱片.ToArray()有什么区别?一个比另一个更有效率吗?更万无一失?

recordsIEnumerable<dynamic> 开头。这意味着它实际上可以是实现 IEnumerable<dynamic> 的任何东西,包括数组。它可能是 List<dynamic> 或其他十几种集合类型之一。

它想创建dynamic[]。如果 records 已经 恰好是 类型 dynamic[],则 records as dynamic[] 将强制转换它并 return 它。如果不是,该特定表达式将 return null,将空合并运算符 (??) 留在右侧 return。

右侧在 records 恰好是什么类型上运行 LINQ 方法 .ToArray(),这会将其转换为 dynamic[] 并且可能涉及比简单演员表。

根据此处实际发生的情况,您也许可以自己稍微改变一下 - 例如,如果您知道 ...; 部分 never return是一个 dynamic[],你也可以只 records.ToArray() 而没有强制转换检查。