1

为什么这个扩展:

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

为 type 的实例工作,List(of Object)但不是 type 的实例List(Of List(Of Object))

Object 是 .net 中最通用的类​​型,那么List(of Object)anObject和扩展应该可以工作吗?

4

4 回答 4

7

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

或者,正如我喜欢说的那样:一束香蕉和一个水果碗不一样。

不过,尚不完全清楚你为什么要写这个——为什么不直接使用Last()扩展方法IEnumerable(Of T)呢?(如果您担心的话,那已经对 进行了优化。)IList(Of T)

可以使您的方法具有通用性-理想情况下是定位IList(Of T)而不是仅仅List(Of T)-但我建议您Last()改用...

于 2012-05-31T19:25:43.513 回答
1

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

不,这需要协方差,IEnumerable(Of Out T)支持但不支持List(Of T)。(注意“Of Out T”)有关详细信息,请参阅 MSDN 关于泛型中的协变和逆变的页面。

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

于 2012-05-31T19:32:50.443 回答
0

因为 aList(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();
于 2012-05-31T19:26:48.953 回答
0
<Extension()> _
Public Function GetLastItem(Of T)(ByVal l As List(Of T)) As T
    Return l(l.Count - 1)
End Function

在将其作为分机调用时,您无需指定 T。

于 2012-06-29T15:40:19.280 回答