Не указывайте параметры универсального типа в явном виде. Типы в ToDictionary<T1, T2>
не являются T1 = TKey
и T2 = TValue
(где TKey
- это тип ключа результирующего словаря, а TValue
- тип результирующего значения в словаре).
Перегрузка ToDictionary
, которая принимает два типовых типа, имеет T = TSource
и V = TKey
. Здесь TSource = KeyValuePair<Product, int>
. Кроме того, вы вызываете overload of ToDictionary
, который имеет два параметра. Первым параметром является карта от T1 -> T2
, а вторая - IEqualityComparer<T2>
. Но x => x.Key
не карта от KeyValuePair<Product, int>
до int
и v => v.Value
не является IEqualityComparer<int>
.
Если вы не зададите параметры универсального типа явно, компилятор проверяет типы x => x.Key
и v => v.Value
и смотрит на различных перегрузках ToDictionary
.Есть четыре
ToDictionary<TSource, TKey>(IEnumerable<TSource>, Func<TSource, TKey>)
ToDictionary<TSource, TKey>(IEnumerable<TSource>, Func<TSource, TKey>, IEqualityComparer<TKey>)
ToDictionary<TSource, TKey, TElement>(IEnumerable<TSource>, Func<TSource, TKey>, Func<TSource, TElement>)
ToDictionary<TSource, TKey, TElement>(IEnumerable<TSource>, Func<TSource, TKey>, Func<TSource, TElement>, IEqualityComparer<TKey>)
Обратите внимание, что он может немедленно исключить из 1. и 4. потому что они имеют неверное число параметров (2 и 4 соответственно, тогда как вы вызываете перегрузку, которая требует трех параметров (третий - это скрытый первый параметр, потому что вы вызываете extensi сверху метод)). Это может исключить 2. поскольку последний параметр не может быть преобразован в IEqualityComparer<T>
для любого T
. Это оставляет последнюю перегрузку. Он способен сделать вывод, что x => x.Key
является Func<KeyValuePair<Product, int>, Product>
, что v => v.Value
является Func<KeyValuePair<Product, int>, int>
и потому, что вы вызываете
ToDictionary<KeyValuePair<Product, int>, Product, int>(
IEnumerable<KeyValuePair<Product, int>>,
Func<KeyValuePair<Product, int>, Product>,
Func<KeyValuePair<Product, int>, int>
)
Если вы хотите, чтобы указать параметры типа явно вы должны сказать
Products.ToDictionary<KeyValuePair<Product, int>, Product, int>(
x => x.Key,
v => v.Value
);
@Brad Christie: `IDictionary `реализует` IEnumerable > `и существует метод расширения` IEnumerable >. ToDictionary`, определенный в статическом классе `Enumerable`. –
jason
2010-11-22 15:54:31