2012-09-06 21 views
4

我有2个实例:为什么.Concat方法的返回值类型看起来有点奇怪:System.Linq.Enumerable +(...)?

 foo and bar 

他们的类型有:

foo.GetType().ToString() 

回报: System.Collections.Generic.List`1 [MyNameSpace.MyClass]

bar.GetType().ToString() 

返回: System.Collections.Generic.List`1 [MyNameSpace.MyClass]

当我concatanate它们:

var foobar = foo.Concat(bar); 

对GetType()返回 System.Linq.Enumerable + d__71 `1 MyNameSpace.MyClass]

问题: 这是什么意思?它不应该是IEnumerable?

回答

8

不要混淆声明的返回类型和返回值的实际类型。 Concat被声明为返回IEnumerable<T>,但它实际上返回实现了IEnumerable<T>的具体类型的实例。 GetType返回具体类型,而不是声明的返回类型。

至于怪异名称,Concat与一个​​实现,并且迭代块由编译器变换为与类型的名字,如实现IEnumerable<T>Enumerable+d__71

+0

所以如果IEnumerable 的返回值是预期的,并且如果我“返回foo.Concat(bar);”那应该没问题?不需要“返回foo.Concat(bar).ToArray();”我对么? – pencilCake

+0

@pencilCake - 你是对的,不需要'.ToArray()'。需要注意的是,如果你确实调用了'.ToArray()',它会在那个时候迭代并将所有结果放入一个新的'MyClass []'数组中。没有'.ToArray()'调用,迭代器的执行是不同的。 – CodingWithSpike

+0

也许不符合上下文的问题,但如果WCF服务返回延迟查询,这是否意味着客户端将失败,因为它不会真正接收查询结果,而是延迟查询呢? – pencilCake

0

除了Thomas的回答,请注意,名称的“1”部分表示泛型参数的数量。每个泛型参数的类型在括号“[...]”中。

相关问题