IEnumerable / 可枚举 Double/Int;初学者
IEnumerable / Enumerable with Double/Int; Beginner
我是从 python 开始接触 C# 的新手,我不清楚 IEnumerable
对象的确切行为方式,即使在阅读了 MSDN 文档之后也是如此。
例如,IEnumerable
需要一个 int,但下面的代码可以正常工作:
IEnumerable<double> squares = Enumerable.Range(1, 100).Select(x => Math.Pow(x, 2));
然而,
IEnumerable<double> square_ = Enumerable.Range(1, 100);
抛出无法将类型 'System.Collections.Generic.IEnumerable int' 隐式转换为 'System.Collections.Generic.IEnumerable double' 的编译错误
我不太确定这是否只是对 Enumerable 的工作方式、对象在 C# 中的工作方式或其他完全不同的东西的根本误解,非常感谢帮助和一些指导新手阅读的地方有更好的主意。
非常感谢。
如果您查看 Math.Pow 的定义,您会发现它 returns 是一个双精度值。
因此,
.Select(x => Math.Pow(x, 2))
是projecting出一个新的IEnumerable<double>
因为Math.Pow
returns一个double
,所以.Select(x => Math.Pow(x, 2));
returns一个IEnumerable<double>
,所以就是你声明的类型。
Enumerable.Range
returns 与 IEnumerable<double>
不兼容的 IEnumerable<int>
。
显然你可以:
IEnumerable<double> squares = Enumerable.Range(1, 100).Select(x => (double)x);
这会将 Enumerable.Range
的单个元素转换为 double
,通过使用 lambda 函数 int -> double
(来自 int x
returns double
)
好吧,这只是 return 类型的问题:
Enumerable.Range(1, 100);
returns IEnumerable<int>
查看MSDN:
Enumerable.Range
Math.Pow
returns double
, 检查here.
您正在尝试设置 IEnumerable<double>
类型,因此 Enumerable.Range(1, 100)
将不起作用。
使用 Linq,您使用 Select(x => Math.Pow(x, 2))
将 ints
投影到 doubles
,这会返回 IEnumerable<double>
Enumerable.Range(1, 100);
returns 一个 IEnumerable 值
同时
Math.Pow(x, 2)
returns 双.
因此,当您尝试第一个选项时,您会遇到转换错误(您的 var 需要 IEnumerable,或者只是 Double 类型,但得到的却是 IEnumerable)。
你可以试试
IEnumerable<double> squares = (IEnumerable<double>)Enumerable.Range(1, 100);
我是从 python 开始接触 C# 的新手,我不清楚 IEnumerable
对象的确切行为方式,即使在阅读了 MSDN 文档之后也是如此。
例如,IEnumerable
需要一个 int,但下面的代码可以正常工作:
IEnumerable<double> squares = Enumerable.Range(1, 100).Select(x => Math.Pow(x, 2));
然而,
IEnumerable<double> square_ = Enumerable.Range(1, 100);
抛出无法将类型 'System.Collections.Generic.IEnumerable int' 隐式转换为 'System.Collections.Generic.IEnumerable double' 的编译错误
我不太确定这是否只是对 Enumerable 的工作方式、对象在 C# 中的工作方式或其他完全不同的东西的根本误解,非常感谢帮助和一些指导新手阅读的地方有更好的主意。
非常感谢。
如果您查看 Math.Pow 的定义,您会发现它 returns 是一个双精度值。
因此,
.Select(x => Math.Pow(x, 2))
是projecting出一个新的IEnumerable<double>
因为Math.Pow
returns一个double
,所以.Select(x => Math.Pow(x, 2));
returns一个IEnumerable<double>
,所以就是你声明的类型。
Enumerable.Range
returns 与 IEnumerable<double>
不兼容的 IEnumerable<int>
。
显然你可以:
IEnumerable<double> squares = Enumerable.Range(1, 100).Select(x => (double)x);
这会将 Enumerable.Range
的单个元素转换为 double
,通过使用 lambda 函数 int -> double
(来自 int x
returns double
)
好吧,这只是 return 类型的问题:
Enumerable.Range(1, 100);
returns IEnumerable<int>
查看MSDN:
Enumerable.Range
Math.Pow
returns double
, 检查here.
您正在尝试设置 IEnumerable<double>
类型,因此 Enumerable.Range(1, 100)
将不起作用。
使用 Linq,您使用 Select(x => Math.Pow(x, 2))
将 ints
投影到 doubles
,这会返回 IEnumerable<double>
Enumerable.Range(1, 100);
returns 一个 IEnumerable 值
同时
Math.Pow(x, 2)
returns 双.
因此,当您尝试第一个选项时,您会遇到转换错误(您的 var 需要 IEnumerable,或者只是 Double 类型,但得到的却是 IEnumerable)。
你可以试试
IEnumerable<double> squares = (IEnumerable<double>)Enumerable.Range(1, 100);