【问题标题】:Casting and Linq Cast<T>()铸造和 Linq Cast<T>()
【发布时间】:2010-07-29 11:18:52
【问题描述】:

在尝试回复this question时,我发现了以下内容:

string s = "test";

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

var result2 = s.Cast<ushort>(); // throws an invalid cast exception

为什么Cast&lt;T&gt;() 在这里失败了?有什么区别?

【问题讨论】:

    标签: linq extension-methods linq-to-objects casting


    【解决方案1】:

    相信你会在这里找到答案:

    Puzzling Enumerable.Cast InvalidCastException

    最后一部分,在编辑下:

    Cast&lt;T&gt;() 是一个扩展方法 IEnumerable 而不是 IEnumerable&lt;T&gt;。这意味着通过 每个值到达要点的时间 在它被投射的地方,它已经 被装箱回System.Object

    【讨论】:

    • 谢谢马丁。那很有意思。因此,由于固有的拳击性能损失,无论如何都应该避免使用 Cast。我很惊讶 MSDN 没有在任何地方提到这一点(无论如何我都能找到)。
    • Cast&lt;T&gt; 仅用于将IEnumerable 提升到IEnumerable&lt;T&gt; 的级别,其中定义了所有其他LINQ 运算符。将IEnumerable&lt;TOriginal&gt; 转换为IEnumerable&lt;TOther&gt; 是一个投影,由Select 完成。 Cast 甚至可以在 IEnumerable&lt;T&gt; 上实现这一事实仅仅是因为 IEnumerable&lt;T&gt; 继承自 IEnumerable - 没有其他原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-01
    • 2015-04-06
    • 2010-10-21
    • 1970-01-01
    相关资源
    最近更新 更多