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.Powreturns一个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);