我是来自python的C#的新手,即使在阅读过MSDN文档之后,我也不清楚IEnumerable
对象的确切行为。
例如,IEnumerable
需要一个int,但以下代码可以正常工作:
IEnumerable<double> squares = Enumerable.Range(1, 100).Select(x => Math.Pow(x, 2));
然而,
IEnumerable<double> square_ = Enumerable.Range(1, 100);
抛出编译错误,你不能隐式转换类型&#39; System.Collections.Generic.IEnumerable int&#39; to&#39; System.Collections.Generic.IEnumerable double&#39;
我不确定这是否只是对Enumerable如何工作,对象如何在C#中工作或其他完全不同的基本误解,并且非常感谢帮助和一些关于在哪里阅读新手的指导得到一个更好的主意。
非常感谢提前。
答案 0 :(得分:2)
由于Math.Pow
会返回double
,因此.Select(x => Math.Pow(x, 2));
会返回IEnumerable<double>
,因此确切地说是您声明的类型。
Enumerable.Range
会返回与IEnumerable<int>
不兼容的IEnumerable<double>
。
显然你可以:
IEnumerable<double> squares = Enumerable.Range(1, 100).Select(x => (double)x);
这会将Enumerable.Range
的单个元素强制转换为double
,方法是使用lambda函数int -> double
(来自int x
的函数返回double
)
答案 1 :(得分:0)
答案 2 :(得分:0)
嗯,这只是返回类型的问题:
Enumerable.Range(1, 100);
返回IEnumerable<int>
检查MSDN:
Enumerable.Range
Math.Pow
返回double
,检查here。
您正在尝试设置IEnumerable<double>
类型,因此Enumerable.Range(1, 100)
无效。
使用Linq,您可以使用ints
将doubles
投射到Select(x => Math.Pow(x, 2))
,然后返回IEnumerable<double>
答案 3 :(得分:0)
Enumerable.Range(1,100);
返回IEnumerable值
而
Math.Pow(x, 2)
返回Double。
因此,当您尝试第一个选项时,会出现转换错误(您的var需要IEnumerable,或者只是Double类型,而是获取IEnumerable)。
你可以试试像
这样的东西IEnumerable<double> squares = (IEnumerable<double>)Enumerable.Range(1, 100);