From MSDN:
Task.WhenAll<TResult>(IEnumerable<Task<TResult>>)
This is the only overload of the four which contains this statement:
If none of the tasks faulted and none of the tasks were canceled, the
resulting task will end in the RanToCompletion state. The Result of
the returned task will be set to an array containing all of the
results of the supplied tasks in the same order as they were provided
(e.g. if the input tasks array contained t1, t2, t3, the output task’s
Result will return an TResult[] where arr[0] == t1.Result, arr1 ==
t2.Result, and arr[2] == t3.Result).