Предварительные и последующие приращения представляют собой два разных оператора и требуют отдельных перегрузок.
C ++ не допускает перегрузки только по типу возврата, поэтому наличие разных типов возвращаемых данных, как в вашем примере, не будет достаточно для устранения двусмысленности двух методов.
Фиктивный аргумент - это механизм, который разработчик C ++ выбрал для устранения неоднозначности.
Вы указываете неправильные общие аргументы. Вы говорите, что TSource - это строка, хотя на самом деле это KeyValuePair.
Это правильный:
sortedDict.ToDictionary<KeyValuePair<string, int>, string, int>(pair => pair.Key, pair => pair.Value);
с краткой версией:
sortedDict.ToDictionary(pair => pair.Key, pair => pair.Value);