LINQ:无法将类型’System.Collections.Generic.IEnumerable ‘隐式转换为’int’

我从以下代码中收到错误:

int dreamX[]; private void Form1_Load(object sender, EventArgs e) { sumX(); } private void sumX() { for (var i = 0; i < 8; i++) { dreamX[i] = from Control control in Controls where control.GetType() == typeof(TextBox) && control.Name.StartsWith("box") select Convert.ToInt32(((TextBox)control).Text); } } 

我收到此错误,如何显式转换此错误。

“无法将类型’System.Collections.Generic.IEnumerable -int-‘隐式转换为’int’”

你想要的是这个:

 int[] dreamX; private void Form1_Load(object sender, EventArgs e) { sumX(); } private void sumX() { dreamX =( from Control control in Controls where control.GetType() == typeof(TextBox) && control.Name.StartsWith("box") select Convert.ToInt32(((TextBox)control).Text)) .ToArray(); } 

from子句生成IEnumerable 集合 。 您可以将其转换为具有.ToArray()扩展名的数组

好吧,该查询可能返回多个值,因此您需要使用.FirstOrDefault().FirstOrDefault()扩展方法。

注意, Single()只有在列表中只有一个元素时才有效, First()只有在列表中至少有一个元素时才有效。 如果列表中没有元素, FirstOrDefault()将恢复为默认值(0)。

根据您的确切需要,您必须选择:)

这么多错了。

首先,您尝试将可能很多转换的整数分配给数组中的单个整数。 这就是错误消息告诉你的。

此外,您展示的代码中没有任何地方是该数组已初始化。 因此,即使你调用类似.FirstOrDefault()东西,你也会得到一个NullReferenceException 。 如果你能提供帮助,最好不要使用arrarys。 坚持使用IEnumerable。

此外,你是linq查询还有一个额外的步骤; 而不是检查Controls集合中每个控件的类型,您应该调用它的.OfType()方法。

最后,linq的美妙之处在于你甚至不必编写for循环。 您只需编写一个语句来评估所有文本框。

 IEnumerable dreamX; private void Form1_Load(object sender, EventArgs e) { sumX(); int totalX = dreamX.Sum(); } private void sumX() { dreamX = from control in Controls.OfType() where control.Name.StartsWith("box") select Convert.ToInt32(control.Text); } 

FirstOrDefault()会将IEnumerable转换为int

实际上它在你的linq查询的输出结果中首次出现。