铸造和Linq Cast <T>()

fea*_*net 6 linq extension-methods linq-to-objects casting

在尝试回答这个问题时,我发现了以下内容:

string s = "test";

var result1 = s.Select(c => (ushort)c); // works fine

var result2 = s.Cast<ushort>(); // throws an invalid cast exception
Run Code Online (Sandbox Code Playgroud)

为什么在Cast<T>()这里失败?有什么不同?

Mar*_*sen 12

认为你会在这里找到答案:

令人费解的Enumerable.Cast InvalidCastException

最后一部分,在编辑下:

Cast<T>()是一种扩展方法, IEnumerable而不是 IEnumerable<T>.这意味着,当每个值到达它所投射的点时,它已被装箱回到aSystem.Object

  • `Cast <T>`仅用于将`IEnumerable`提升到`IEnumerable <T>`的级别,其中定义了所有其他LINQ运算符.采用`IEnumerable <TOriginal>`并将其转换为`IEnumerable <TOther>`是一个投影,由`Select`完成."Cast"甚至可以在"IEnumerable <T>"上实现,这仅仅是因为`IEnumerable <T>`继承自`IEnumerable` - 没有其他原因. (5认同)