Это выглядит для меня как ошибка или, в лучшем случае, дрянной дизайн.Чтобы упростить задачу:
var stream = Observable.Return(1);
var result2 = await stream.Zip(stream, (a, b) => (a, b));
var result3 = await stream.Zip(stream, stream, (a, b, c) => (a, b, c));
Console.WriteLine($"result2 = {result2}");
Console.WriteLine($"result3 = {result3}");
result2
работает, потому что zip дает значение.Наблюдаемая result3
не дает значения, поэтому ожидание не выполняется.Тем не менее, он должен дать значение.Вот документация по этой перегрузке:
Объединяет указанные наблюдаемые последовательности в одну наблюдаемую последовательность с помощью функции селектора всякий раз, когда все наблюдаемые последовательности создали элемент с соответствующим индексом.
Поскольку все они дали значение с индексом 0, вы должны увидеть значение.Итак ... ошибка.
Интересно, если вы переопределите stream
как таковое:
var stream = Observable.Return(1).Delay(TimeSpan.FromMilliseconds(15));
... тогда оба сработают.Ошибка, вероятно, связана с некоторым состоянием гонки.
Я думаю, что парная функция (с 2 наблюдаемыми) старше и проверена лучше, чем n-мудрые перегрузки.