Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么从IEnumerable开始强制转换<;字符串>;列出<;字符串>;失败?_C#_Linq_Casting_Classcastexception - Fatal编程技术网

C# 为什么从IEnumerable开始强制转换<;字符串>;列出<;字符串>;失败?

C# 为什么从IEnumerable开始强制转换<;字符串>;列出<;字符串>;失败?,c#,linq,casting,classcastexception,C#,Linq,Casting,Classcastexception,为什么以下内容无法成功地将IEnumerable转换为List var l=新列表(); l、 添加(新元组(“字符串”,1)); 列表s=(列表)l.Select(x=>x.Item1);//System.InvalidCastException MessageBox.Show(s[0]); 另外,为什么在VisualStudio中不能正确捕获异常?它出现在调试窗口中,但不会停止程序的执行。Select返回一个IEnumerable。如果要将结果作为列表,请使用: List<strin

为什么以下内容无法成功地将
IEnumerable
转换为
List

var l=新列表();
l、 添加(新元组(“字符串”,1));
列表s=(列表)l.Select(x=>x.Item1);//System.InvalidCastException
MessageBox.Show(s[0]);

另外,为什么在VisualStudio中不能正确捕获异常?它出现在调试窗口中,但不会停止程序的执行。

Select
返回一个
IEnumerable
。如果要将结果作为
列表
,请使用:

List<string> s = l.Select(x => x.Item1).ToList()
List s=l.Select(x=>x.Item1).ToList()
在内部,
Select
方法根本不生成
列表
;当迭代
IEnumerable
时,元素会动态返回


除了被抓住的例外情况外,我都愿意。我的猜测是,您有一个捕获(可能不是您添加的捕获)正在沿途的某个地方拾取它。

Select
返回一个
IEnumerable
。如果要将结果作为
列表
,请使用:

List<string> s = l.Select(x => x.Item1).ToList()
List s=l.Select(x=>x.Item1).ToList()
在内部,
Select
方法根本不生成
列表
;当迭代
IEnumerable
时,元素会动态返回


除了被抓住的例外情况外,我都愿意。我的猜测是,你有一个陷阱(也许不是你添加的陷阱)在某个地方找到了它。

这是因为你的方法完全错了;您可以将Select的结果转换为一个列表,而不是那样,因为它是一个IEnumerable而不是列表。如果你想要一份清单,那就做吧

var string_list = l.Select(x => x.Item1).ToList();
如果你绝对地,具体地说,100%,当然地知道你只有一个元素[1],那么做:

var l = new List<Tuple<string, int>>();
l.Add(new Tuple<string, int>("a string", 1));
MessageBox.Show( l.Select(x => x.Item1).First() );
如果您想有效地使用LINQ,那么了解正在发生的事情并认识到您正在创建的是某种结果集是很重要的——这与原始列表不同,这就是IMO LINQ难以置信的强大之处——您只需要了解它



1-在这种情况下,你为什么要使用列表…

这是因为你的方法完全错误;您可以将Select的结果转换为一个列表,而不是那样,因为它是一个IEnumerable而不是列表。如果你想要一份清单,那就做吧

var string_list = l.Select(x => x.Item1).ToList();
如果你绝对地,具体地说,100%,当然地知道你只有一个元素[1],那么做:

var l = new List<Tuple<string, int>>();
l.Add(new Tuple<string, int>("a string", 1));
MessageBox.Show( l.Select(x => x.Item1).First() );
如果您想有效地使用LINQ,那么了解正在发生的事情并认识到您正在创建的是某种结果集是很重要的——这与原始列表不同,这就是IMO LINQ难以置信的强大之处——您只需要了解它



1-在这种情况下,为什么要使用列表…

我认为Andrew的操作假设是,静态类型是IEnumerable,而动态类型是list,因为它是从列表中选择的。你能否澄清事实并非如此?正如你所写,我已经澄清了这种假设是假的,因为当你手工编写枚举器的代码时,出于效率的原因,你不会把它列为一个列表。要成为一个列表,它必须全部计算,如果不想成为一个列表,这是一种浪费。枚举器可以在处理过程中动态返回行。我认为Andrew的操作假设静态类型是IEnumerable,而动态类型是List,因为它是从列表中选择的。你能否澄清事实并非如此?正如你所写,我已经澄清了这种假设是假的,因为当你手工编写枚举器的代码时,出于效率的原因,你不会把它列为一个列表。要成为一个列表,它必须全部计算,如果不想成为一个列表,这是一种浪费。枚举数只能在处理过程中动态返回行。因为它返回的IEnumerable不是列表,强制转换(与隐式/显式转换不同)无法更改对象的类型:
l.Select(x=>x.Item1)。GetType().Name
@pst casting无法更改对象的类型。您能解释该部分吗?对象就是它。i、 字符串始终是字符串<代码>对象s=“foo”;(string)s可以,因为对象的类型是
字符串(即
s.GetType()==typeof(string)
)<代码>对象n=1;(string)n
不正常,因为类型(
int
)不是
string
(或以其他方式可分配),强制转换将失败。C#有隐式/显式(看起来像casting:-/),但这不是相同意义上的casting。通过铸造输入对象和输出对象是相同的,但是“视图”发生变化。考虑如下:<代码>对象A =“HI”;字符串s1=(字符串)a,然后
s1。ReferenceEquals(a)
为真。因此,当它不是列表(或列表的子类型)时,说“将符合IEnumerable接口的对象转换为列表”是没有意义的。这就是ClassCastException的意思:不能更改类型。@pst Ok,但是(在不太了解C#的情况下)“将符合IEnumerable接口的对象转换为列表”对我来说似乎是一个定义非常好的操作。你是说(一般来说)它需要一个“转换”,因此需要内存中的一个新对象,这就是为什么我使用的“查看为”转换失败的原因吗?因为它返回的IEnumerable不是列表,转换(与隐式/显式转换不同)无法更改对象的类型:
l.Select(x=>x.Item1)。GetType().Name
@pst casting无法更改对象的类型。您能解释该部分吗?对象就是它。i、 字符串始终是字符串<代码>对象s=“foo”;(string)s是正常的,因为对象的类型是
string
(即
s.GetType()==typeof(string)