Help us understand the problem. What is going on with this article?

小ネタ:Index付きSelectが限界超えたらどー成るか?

More than 3 years have passed since last update.

どーいうことだってばよ?

public static IEnumerable<TResult> Select<TSource, TResult>(this IEnumerable<TSource> source,Func<TSource, int, TResult> selector)sourceの要素数が、Int32.MaxValue超えたらどーなるのか気になったので試してみた。

試してみたこと

以下のようなモノをこさえて、後はひたすら回すべしw

using System;
using System.Collections.Generic;
using System.Linq;

namespace ConsoleApplication2
{
    class Program
    {
        static IEnumerable<long> CreateSequence()
        {
            for (long i = 0; i <= 2147483648; i++) yield return i;
        }
        static void Main(string[] args)
        {
            try
            {
                foreach (var elem in CreateSequence().Select((l, i) => new KeyValuePair<int, long>(i, l)))
                {
                    if (elem.Value%1000000 == 0)
                    {
                        Console.WriteLine((elem.Value/2147483648.0*100).ToString("F2") + "%");
                    }
                }
            }
            catch (OverflowException)
            {
                Console.WriteLine("Overflow detected!");
            }

            Console.WriteLine("Press enter to exit.");
            Console.ReadLine();
        }

    }
}

こいつを、/checked-でコンパイルしてOverFlowExceptionが飛んでくるかどうか試してみた。

結果とまとめ

飛んできた。
当該部分のコードリーディングしたところ、インデックスとして、selectorデリゲートに渡される変数のインクリメント部分が、明示的にcheckedブロックで括られていたのでまぁそりゃそうなるよね。
Int32.MaxValue超えるなんてそうそう無いとは思うけど、これも後学の為ということで一つ。

Tokeiya
C#スコシワカル
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away