Enumerable.Cast 中令人费解的 Cast 异常
尝试将整数 (int) 的 IEnumerable 转换为 IEnumerable 时遇到 InvalidCastException使用 Cast 运算符的长整数(longs),如图所示下面:
using System.Collections.Generic; using System.Linq; namespace InvalidCast { class Program { static void Main(string[] args) { // Initialize a list of ints IEnumerable<int> list = new List<int>() { 1 }; // Attempt to cast the list to longs IEnumerable<long> castedList = list.Cast<long>(); // Attempt to write the first element of the casted list Console.WriteLine(castedList.First()); } } }
为什么会发生此异常?
此行为是意外的,因为 Cast 运算符旨在执行安全可靠的转换。然而,这个特殊案例展示了一个特殊问题,该问题是由于 .NET 3.5 和 .NET 3.5 SP1 之间的 Cast 行为修改而引起的。
问题的根源
Cast 运算符是为 IEnumerable(集合的基接口)定义的扩展方法,而不是专门为IEnumerable
因此,转换过程模仿以下内容:
int i = 1; object o = i; long l = (long)o;
此代码当它尝试将装箱 int 转换为 long 时抛出 InvalidCastException,而不是直接转换int.
解决方法
要解决此问题,需要使用 lambda 表达式或 select 方法显式执行转换,如下所示:
// Cast using a lambda expression var castedList = list.Select(i => (long)i); // Cast using a select method var castedList = from long l in list select l;
这些方法显式地将每个 int 值转换为 long,避免装箱/拆箱过程并规避InvalidCastException。
以上是为什么从'IEnumerable”进行转换时,'Enumerable.Cast”会抛出'InvalidCastException”?的详细内容。更多信息请关注PHP中文网其他相关文章!