【问题标题】:Determine type in return Enumerable.Range()确定返回 Enumerable.Range() 的类型
【发布时间】:2019-02-02 12:38:06
【问题描述】:

试图了解下面示例中返回 Enumerable.Range() 函数的数据类型:

var numbers = Enumerable.Range(0, 100000000);
Console.WriteLine( numbers.GetType().FullName );

根据描述它应该返回IEnumerable<int>。但根据我的理解,这只是接口,返回的对象类应该实现这个接口。那是什么东西?

控制台输出带来

System.Linq.Enumerable+<RangeIterator>d__113

我不知道可以在我的代码行中放置什么类型而不是 var。我在 MSDN 中根本找不到 RangeIterator 类型。 d__113 在这个输出中是什么意思?

【问题讨论】:

  • I can't figure out what type I can place instead of var in my code line. 为什么需要或想要这样做? IEnumerable&lt;int&gt; 会起作用,但你又何必在意呢?
  • 您应该使用接口,因为这就是返回的内容。为什么需要具体的实现,无论如何它都是私有的?即使它不是私有的,将它类型转换为具体类型有什么好处,这只会在将来接口实现发生变化时引入破坏代码的潜在错误。
  • 与其将其视为具体类型,不如将其视为迭代时通过的数字流。

标签: c# linq ienumerable


【解决方案1】:

如果您查看有问题的代码的来源,它应该可以了解实际发生的情况

来源Enumerable.Range

public static IEnumerable<int> Range(int start, int count) {
    long max = ((long)start) + count - 1;
    if (count < 0 || max > Int32.MaxValue) throw Error.ArgumentOutOfRange("count");
    return RangeIterator(start, count);
}

static IEnumerable<int> RangeIterator(int start, int count) {
    for (int i = 0; i < count; i++) yield return start + i;
}

我不知道我可以在我的代码行中放置什么类型而不是 var

只需使用IEnumerable&lt;int&gt;

IEnumerable<int> numbers = Enumerable.Range(0, 100000000);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多