Были преобразование код из VB.Net в C#, когда я наткнулся на это, в каком-то коде с помощью Zip библиотеки Ionic:Почему я могу применить индексацию к ICollection в 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, и он строит successfullly:
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];
}
}
}
Почему это происходит, и есть ли способ вокруг него ?
Я предполагаю, что идея о том, что вы * не можете * сделать это на C#, больше оставлена от C, где вы утверждаете, что оператор '[]' может эффективно индексировать последовательность, используя режимы адресации x86. В то время как в VB вы говорите, что хотите третий элемент, и вы получаете 3-й элемент. – dialer
@ dialer: Ну, положение индексатора не имеет * *, чтобы быть ужасно эффективным, но мне не нравится идея его неявного, без указания вызывающему, что это не обеспечивается объявлением класс. Бывают случаи, когда это может быть резко драматичным - представьте, если вы использовали цикл for по индексу вместо цикла foreach, для чего-то, что нужно было читать текстовый файл каждый раз, чтобы добраться до n-й строки (или что-то еще). –