.net List(列表(对象))扩展

时间:2012-05-31 19:24:03

标签: .net vb.net extension-methods

为什么要扩展:

<Extension()> _
    Public Function GetLastItem(ByVal l As List(Of Object)) As Object
        Return l(l.Count - 1)
    End Function

适用于List(of Object)类型的实例,但不适用于List(Of List(Of Object))类型的实例?

对象是.net中最通用的类​​型,因此List(of Object)Object,扩展应该有效吗?

4 个答案:

答案 0 :(得分:7)

不,List(Of List(Of Object))不是List(Of Object)。例如,您可以向后者添加新的Object(),但不能向前者添加。{/ p>

另外,正如我喜欢的那样:一堆香蕉和水果碗不一样。

尽管如此,为什么你还要写这个并不完全清楚 - 为什么不在IEnumerable(Of T)上使用Last()扩展方法呢? (That already has an optimization for IList(Of T),如果那是你担心的。)

可以使你的方法通用 - 理想情况下定位IList(Of T)而不只是List(Of T) - 但我建议您只使用Last()代替..

答案 1 :(得分:1)

  

对象是.net中最通用的类​​型,所以List(对象)是一个对象,扩展应该可以工作......?

没有。这需要协方差,IEnumerable(Of Out T)List(Of T)支持协方差。 (请注意“ Out T)有关详细信息,请参阅Covariance and Contravariance in Generics上的MSDN页面。

请注意,在这种情况下,LINQ中已经有一个扩展方法:Enumerable.Last

答案 2 :(得分:0)

因为List(Of List(Of Object))不是Object

重写您的扩展程序:\

<Extension()>_
Public Function GetLastItem(ByVa l As List(Of T) As T
  Return l(l.Count - 1)
End Function

事实上,这更为一般:

<Extension()>_
Public Function GetLastItem(ByVa l As IEnumerable(Of T) As T
  Return l.ElementAt(l.Count() - 1)
End Function

当然,你应该只使用Linq:

someListOfThings.Last();

答案 3 :(得分:0)

<Extension()> _
Public Function GetLastItem(Of T)(ByVal l As List(Of T)) As T
    Return l(l.Count - 1)
End Function

将其称为扩展名时,您无需指定T.