gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 18:00:54 26 4
gpt4 key购买 nike

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

代码:

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com