No especifique los parámetros de tipo genérico de forma explícita. Los tipos en ToDictionary<T1, T2>
no son T1 = TKey
y T2 = TValue
(donde TKey
es el tipo de la clave del diccionario resultante y TValue
es el tipo del valor resultante en el diccionario).
La sobrecarga de ToDictionary
que acepta dos parámetros genéricos de tipo tiene T = TSource
y V = TKey
. Aquí, TSource = KeyValuePair<Product, int>
. Además, está invocando el overload of ToDictionary
que tiene dos parámetros. El primer parámetro es un mapa de T1 -> T2
y el segundo es un IEqualityComparer<T2>
. Pero x => x.Key
no es un mapa de KeyValuePair<Product, int>
a int
y v => v.Value
no es un IEqualityComparer<int>
.
Cuando no se especifica los parámetros de tipo genérico de forma explícita, el compilador inspecciona los tipos de x => x.Key
y v => v.Value
y mira a las diversas sobrecargas de ToDictionary
.Hay cuatro
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>)
Tenga en cuenta que se puede descartar inmediatamente y 1. 4. porque tienen un número incorrecto de parámetros (2 y 4 respectivamente mientras está invocando una sobrecarga que necesita tres parámetros (el tercero es el primer parámetro oculto porque está invocando una extensión en el método)). Puede descartar 2. porque el último parámetro no se puede convertir a IEqualityComparer<T>
para cualquier T
. Esto deja la última sobrecarga. Es capaz de deducir que x => x.Key
es una Func<KeyValuePair<Product, int>, Product>
, que v => v.Value
es una Func<KeyValuePair<Product, int>, int>
y por lo tanto que está invocando
ToDictionary<KeyValuePair<Product, int>, Product, int>(
IEnumerable<KeyValuePair<Product, int>>,
Func<KeyValuePair<Product, int>, Product>,
Func<KeyValuePair<Product, int>, int>
)
Si desea especificar los parámetros de tipo de forma explícita que tendría que decir
Products.ToDictionary<KeyValuePair<Product, int>, Product, int>(
x => x.Key,
v => v.Value
);
@Brad Christie: 'IDictionary 'implementa' IEnumerable > 'y hay un método de extensión' IEnumerable >. ToDictionary' definido en la clase estática 'Enumerable'. –
jason