Почему происходит сбой `String () (). Concat (IEnumerable (Of IEnumerable (Of String)))? - PullRequest
0 голосов
/ 20 мая 2019

Эта проблема возникла как обсуждение в комментариях к этому вопросу .Не стесняйтесь искать больше контекста, если хотите.

Допустим, у нас есть следующие три переменные:

Dim stringArray = {"foo", "bar"}
Dim jaggedArray = {stringArray}
Dim nestedIEnumerable = jaggedArray.Select(Function(arr) arr.Select(Function(s) s))

Мы можем легко объединить два экземпляра nestedIEnumerable:

Dim concatenated = nestedIEnumerable.Concat(nestedIEnumerable)

Но при попытке вызвать Concat() для зубчатого массива:

Dim concatenated = jaggedArray.Concat(nestedIEnumerable)

.. он не компилируется и жалуется на следующее:

'IEnumerable (IEnumerable (Of String)) «не может быть преобразован в« IEnumerable (Of String ()) », поскольку« IEnumerable (Of String) »не является производным от« String () », как требуется для универсального параметра« Out »T'in' Интерфейс IEnumerable (Of Out T) '.

Теперь это странно, поскольку String()() может быть неявно , преобразованным в IEnumerable(Of IEnumerable(Of String)):

Dim casted As IEnumerable(Of IEnumerable(Of String)) = jaggedArray
Dim concatenated = casted.Concat(nestedIEnumerable)

Это также работает просто отлично:

Dim concatenated = {stringArray.AsEnumerable}.Concat(nestedIEnumerable)

Почему первый отказывает, хотя между двумя типами происходит неявное преобразование?

Примечание.C # версия первого кода работает без проблем:

var stringArray = new[] { "foo", "bar" };
var jaggedArray = new[] { stringArray };
var nestedIEnumerable = jaggedArray.Select((arr) => arr.Select((s) => s));

var concatenated = jaggedArray.Concat(nestedIEnumerable);
...