1

この拡張機能の理由:

<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

4 に答える 4

7

いいえ、 aList(Of List(Of Object))は ではありませんList(Of Object)Object()たとえば、後者には新しいを追加できますが、前者には追加できません。

別の言い方をすれば、バナナの束はフルーツ ボウルと同じではありません。

とにかく、なぜこれを書いているのかは完全には明らかではありません.onの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 のGenerics における共分散と反分散に関するページを参照してください。

この場合、LINQ にはEnumerable.Lastという拡張メソッドが既に存在することに注意してください。

于 2012-05-31T19:32:50.443 に答える
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 に答える
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();
于 2012-05-31T19:26:48.953 に答える