14

Ionic Zip ライブラリを使用するコードで、VB.Net から C# にコードを変換していたときに、これに遭遇しました。

Dim zipEntry1 As ZipEntry = zipFile1.Entries(0)

簡単です:

ZipEntry zipEntry1 = zipFile1.Entries[0];

C# で次のエラーが発生します。

タイプ 'System.Collections.Generic.ICollection' の式に [] を使用したインデックス作成を適用することはできません

どちらも同じバージョンの DLL を使用しており、どちらもzipFile1.EntriesジェネリックICollectionです。

VB.Net で以下をテストしたところ、正常にビルドされました。

Option Strict On
Option Explicit On

Imports Ionic.Zip

Module Module1

    Sub Main()

        Dim zipFile1 = ZipFile.Read("C:\test")
        Dim zipEntry = zipFile1.Entries(0)

    End Sub

End Module

これはビルドされません:

using Ionic.Zip;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            var zipFile1 = ZipFile.Read(@"C:\test");
            var zipEntry = zipFile1.Entries[0];
        }
    }
}

なぜこれが起こるのですか、それを回避する方法はありますか?

4

4 に答える 4

7

厳密に見ると、要素の順序付けられていないコレクション (より正確には、インデックスによって要素に個別にアクセスできないコレクション)ICollection<T>へのインターフェイスです。それはまさに定義によるものです。

ElementAt(int index)ただし、LINQ の拡張メソッドは引き続き使用できます。indexこれは、呼び出すたびにすべての要素を反復処理するだけです (したがって、一般的には遅くなります)。

注:ICollection<T>と混同しないでくださいCollection<T>。後者はIList<T>(とりわけ) を実装します。これは、定義により各要素がそのインデックスによってアクセスできることを指定します。

于 2013-04-07T16:38:44.923 に答える
0

VB は長い間、そのクラスのデフォルト メンバーという考えを持っていました。これは、コレクションの場合は常にメンバーItem () です。

于 2013-04-07T20:48:58.687 に答える