c# - 我真的只是将字符串数据类型放入 IEnumerable<int>

标签 c# linq casting

好吧,这有点奇怪。忽略我正在尝试做的事情,看看在这种情况下发生的结果。

代码:

static string rawNumbers="1,4,6,20,21,22,30,34";
static IEnumerable<int> numbers = null;

static void Main(string[] args)
{
    numbers = rawNumbers.Split(',').Cast<int>();

    for (int i = 0; i < numbers.Count(); i++)
    {
        //do something
    }

}

情况:

numbers = rawNumbers.Split(',').Cast<int>(); 似乎 正常工作,并且没有抛出异常。但是,当我遍历集合时,会抛出 InvalidCastException。

现在,深入源代码并查看 CastIterator<TResult> .这似乎在 for (int i = 0; i < numbers.Count(); i++) 被调用...特别是 numbers.Count()

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

错误发生在转换中,当我查看 source 中的数据时可变的,它是一个字符串[]。

我本以为,自从我调用转换为 int 的行成功执行后,一切都很好。幕后发生了什么?字符串数组真的只是存储在某个地方,直到被调用才被转换为 T 吗?可能是惰性类型转换?


我知道我做不到:(int)"42"。我的问题不是如何让 Actor 工作,而是发生了什么。延迟执行类型转换?我喊出 Cast<int>() 的那一行似乎很奇怪似乎有效,但实际上无效。

最佳答案

有几点:首先,您不能 string 转换为int。您可以解析一个字符串并得到一个结果整数。但本质上你是想这样做:

int x = (int)"32";

那是个异常(exception)。 其次,LINQ 运算符是延迟执行的,因此在您尝试迭代结果之前实际上什么都不会发生,那才是真正的工作开始发生的时候。

延迟执行不会检查您请求的操作是否有效或是否可以正确执行,它只是设置操作,然后尝试在迭代时单独执行。

关于c# - 我真的只是将字符串数据类型放入 IEnumerable<int>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4148647/

相关文章:

c# - AutoMapper 将未映射的属性映射到 Dictionary/ExtensionData

c# - 限制 ASP.net 下拉菜单

c# - 类型转换盒装值

c# - 带有 Type 变量的 Cast<T>()

java - 如果应该避免向下转型,我应该怎么做?

c# - 如何将可选指针参数从 C++ 代码转换为 C#

c# - 调整Gridview宽度

c# - 是什么导致 Linq 错误 : This method cannot be translated into a store expression?

c# - foreach 上的 if 语句

c# - Linq c# - 加入多个条件错误