为什么`String()()。Concat(IEnumerable(Of IEnumerable(Of String)))会失败?

时间:2019-05-20 02:28:02

标签: .net vb.net linq generics type-inference

这个问题出现在this question的评论中。如果您愿意,可以随时寻求更多背景信息。

假设我们具有以下三个变量:

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)

.. it无法编译,并抱怨以下内容:

  

'IEnumerable(Of IEnumerable(Of String))'无法转换为   'IEnumerable(Of String())',因为'IEnumerable(Of String)'不是   从'String()'派生,如'Out'通用参数所需   接口IEnumerable(Of T)中的“ 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);

0 个答案:

没有答案