【问题标题】:.net List(Of List(of Object)) Extension.net 列表(列表(对象))扩展
【发布时间】:2012-05-31 19:24:02
【问题描述】:

为什么要做这个扩展:

<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)) 类型的实例?

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

【问题讨论】:

    标签: .net vb.net extension-methods


    【解决方案1】:

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

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

    不过,尚不完全清楚你为什么要写这个——为什么不直接在IEnumerable(Of T) 上使用Last() 扩展方法? (That already has an optimization for IList(Of T),如果这就是你所担心的。)

    可以使您的方法通用-理想情况下针对IList(Of T)而不仅仅是List(Of T)-但我建议您只使用Last()...

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

        因为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();
        

        【讨论】:

        • 谢谢。我尝试使用您的示例,但出现错误“未定义 T 型”...?我在c++上已经用过template了,是不是类似?
        • 我对 VB.NET 语法不是很熟悉。我是一个 C# 人。尽管如此,您绝对应该只使用框架提供的扩展。工作量少很多。
        【解决方案4】:
        <Extension()> _
        Public Function GetLastItem(Of T)(ByVal l As List(Of T)) As T
            Return l(l.Count - 1)
        End Function
        

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

        【讨论】:

          猜你喜欢
          • 2018-06-28
          • 2012-02-19
          • 1970-01-01
          • 2015-12-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-02-26
          • 2017-05-22
          相关资源
          最近更新 更多