Я использую Microsoft .NET Framework 4.0.
Я столкнулся с этим, используя Aggregate на Dictionary<T, List<T>>
, чтобы извлечь набор значений типа T
, используемых во всех списках типа List<T>
в словаре. Вот самый простой случай, который я мог придумать, который демонстрирует такое же поведение.
Во-первых, как указано в документации , следующее работает :
var set = new HashSet<int>();
var list = new LinkedList<int>();
var newSet = set.Union(list);
То есть я могу вызвать Union
для HashSet
с List
в качестве аргумента (поскольку он реализует IEnumerable
).
Принимая во внимание, что эквивалентное выражение в аргументе Func
выражения LINQ Aggregate
выдает ошибку (по крайней мере, прекомпилятор):
new List<int>[] { new List<int>() }.Aggregate(new HashSet<int>(), (acc, list) => acc.Union(list));
Он ожидает, что аргумент Union будет HashSet, и будет взаимодействовать, если он ему дан, вопреки его поведению вне выражений LINQ / Func.
Примером из реальной жизни, который я использовал, когда столкнулся с проблемой, было:
public AdjacencyListGraph(Dictionary<TVertex, LinkedList<TVertex>> adjacencyList)
{
var vertices = adjacencyList.Aggregate(new HashSet<TVertex>(),
(vertices, list) => vertices.Union(list.Value));
}
Который жалуется, что не может конвертировать IEnumerable<TVertex>
в HashSet<TVertex>
...