这个问题出现在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);