c# - .Cast<T> 扩展方法总是抛出 InvalidCastException - 你应该如何使用这个方法?

标签 c# linq exception casting extension-methods

有几次我对 .Cast<T> 感到好奇LINQ 扩展方法。我心想“这听起来正是我在这种情况下所需要的”,但每当我尝试使用它时,我总是得到一个 InvalidCaseException。 .我从来没有能够成功地使用这种方法。这是检查异常的示例行:

Enumerable.Range(0,10).Cast<float>().ForEach(Console.Out.WriteLine);

类型转换一个int没有什么争议到 float ,那么为什么这个方法拒绝这样做呢?我可以通过简单地替换 .Cast<float> 来解决这个问题并获得所需的效果用.Select(x => (float)x)

Enumerable.Range(0, 10).Select(x => (float)x).ForEach(Console.Out.WriteLine);

这不是太麻烦,但我仍然不明白为什么 Cast<float>方法无法为我完成这项工作。

问题简而言之:您如何使用 .Cast<T>扩展方法?

这与问题无关,但以防万一有人想知道,我在上面的代码片段中使用了自定义 ForEach 扩展方法(标准方法仅适用于列表):

static class Extensions
{
    public static void ForEach<T>(this IEnumerable<T> x, Action<T> l)
    {
        foreach (var xs in x) l(xs);
    }
}

最佳答案

如果你看ReferenceSource Cast<TResult> 的源代码方法,你会看到最后CastIterator<TResult>方法被调用,类似于:

static IEnumerable<TResult> CastIterator<TResult>(IEnumerable source)
{
    foreach (object obj in source) yield return (TResult)obj;
}

如您所见,C# 尝试转换为 TResult来自 boxed 对象,这是异常的原因。如果您想模仿问题,请尝试以下操作:

int a = 5;
object o = a;
float f = (float)o;

关于c# - .Cast<T> 扩展方法总是抛出 InvalidCastException - 你应该如何使用这个方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40734587/

相关文章:

java线程异常

c# - Windows 窗体中的自定义锚定

c# - LINQtoSQL 生成的 SQL 中有太多外连接

c# - 有没有一种使用 LINQ 合并两个有序序列的简单方法?

c# - if/null 的简短记录

java - 为什么在 JNDI 中的 JMS ConnectionFactory 查找上出现 ClassCastException?

c# - 如何使用 Simple Injector 注册命名实例

c# - 为什么 TinyMCE 不能与 asp 文本框一起使用,而是与 html textarea 一起使用?

c# - 透明窗口层,可点击并始终保持在顶部

java - 在java中创建异常列表