为什么要扩展:
<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
,扩展应该有效吗?
答案 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.