【问题标题】:IEnumerable / Enumerable with Double/Int; BeginnerIEnumerable / Enumerable with Double/Int;初学者
【发布时间】:2017-08-02 09:24:52
【问题描述】:

我是来自 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# 中的工作方式或完全其他方面的基本误解,非常感谢帮助和一些指导,帮助新手在哪里阅读以获得更好的主意。

提前非常感谢。

【问题讨论】:

  • 我不认为它会抛出异常,你的意思是编译错误。
  • 正确,对不起 Neme;又是一个来自解释语言的误称:)。
  • 这个问题太宽泛了,因为它涉及到您的许多误解,以及对特定领域术语的不精确使用。例如,您描述的错误消息不是 "throw" (仅在运行时发生,有异常),而只是编译时错误。此外,在任何情况下,非通用 IEnumerable 接口(不是 "object")都不需要 "require an int"。 ...
  • ... 而 “工作正常” 的代码之所以这样做,是因为存在从 intdouble 的隐式转换。您得到的错误与一个完全不同的问题有关,与泛型类型的差异有关。充分详细地解释所有这些远远超出了一个好的 Stack Overflow 问题的范围,尤其是考虑到问题的所有不相关部分。
  • 如果我的问题范围太广,我深表歉意。我希望你也能原谅我的语法错误,因为我刚刚学习了语言,接口和对象之间的差异仍然超出了我的理解范围。如果您认为可以更好地将我引导到对我的知识水平有意义的资源,请随时关闭它或建议改写,以便其他人可以在这里找到帮助。

标签: c# .net ienumerable enumerable


【解决方案1】:

Enumerable.Range(1, 100);

返回一个 IEnumerable 值

同时

Math.Pow(x, 2)

返回双精度。

因此,当您尝试第一个选项时,您会收到一个转换错误(您的 var 需要 IEnumerable,或者只是 Double 类型,但会获得 IEnumerable)。

你可以试试

IEnumerable<double> squares = (IEnumerable<double>)Enumerable.Range(1, 100);

【讨论】:

    【解决方案2】:

    嗯,这只是返回类型的问题:

    Enumerable.Range(1, 100); 返回IEnumerable&lt;int&gt; 查看 MSDN: Enumerable.Range

    Math.Pow 返回double,检查here

    您正在尝试设置IEnumerable&lt;double&gt; 类型,因此Enumerable.Range(1, 100) 将不起作用。

    使用 Linq,您可以将 ints 投影到 doubles,而 Select(x =&gt; Math.Pow(x, 2)) 会返回 IEnumerable&lt;double&gt;

    【讨论】:

      【解决方案3】:

      因为Math.Pow 返回一个double,所以.Select(x =&gt; Math.Pow(x, 2)); 返回一个IEnumerable&lt;double&gt;,所以正是你声明的类型。

      Enumerable.Range 返回与 IEnumerable&lt;double&gt; 不兼容的 IEnumerable&lt;int&gt;

      显然你可以:

      IEnumerable<double> squares = Enumerable.Range(1, 100).Select(x => (double)x);
      

      这会将Enumerable.Range 的单个元素转换为double,通过使用lambda 函数int -&gt; double(从int x 返回double

      【讨论】:

      • 谢谢,这很好地解释了正在进行的类型转换。我可能应该重新阅读文档。阅读和记住您使用的每个 System 泛型方法的文档会让人筋疲力尽。
      【解决方案4】:

      如果您查看Math.Pow 的定义,您会发现它返回一个双精度值。

      因此,

      .Select(x => Math.Pow(x, 2))
      

      projecting 出一个新的IEnumerable&lt;double&gt;

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-09
        • 1970-01-01
        • 2023-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-17
        • 2012-12-20
        相关资源
        最近更新 更多