好吧,这有点奇怪。忽略我正在尝试做的事情,看看在这种情况下发生的结果。
代码:
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/