Это по стечению обстоятельств, хотя и предсказуемо. Вы абсолютно не должны полагаться на это. Обычно это будет для простых ситуаций, но если вы начнете удалять элементы и заменять их чем-либо либо с тем же хеш-кодом, либо просто попадать в тот же сегмент, этот элемент займет позицию оригинала, несмотря на будучи добавленным позже, чем другие.
Это довольно сложно воспроизвести, но мне удалось это сделать некоторое время назад для другого вопроса :
using System;
using System.Collections.Generic;
class Test
{
static void Main(string[] args)
{
var dict = new Dictionary<int, int>();
dict.Add(0, 0);
dict.Add(1, 1);
dict.Add(2, 2);
dict.Remove(0);
dict.Add(10, 10);
foreach (var entry in dict)
{
Console.WriteLine(entry.Key);
}
}
}
Результаты показывают 10, 1, 2, а не 1, 2, 10.
Обратите внимание, что, несмотря на то, что поведение current всегда будет давать элементы в порядке вставки, если вы не удалите их, нет гарантии, что будущие реализации сделают то же самое ... так что даже в ограниченном случае, когда вы знаете, что ничего не удалите, не полагайтесь на это.