Я заметил странную вещь VB.NET. Исходя из этого вопроса Я предоставил способ доступа к ключам и значениям словарей KeysCollection
и ValuesCollection
через индекс, чтобы получить, скажем, первый элемент. Я знаю, что он имеет смысл только в SortedDictionary
, так как нормальный Dictionary
не упорядочен (ну, вы не должны полагаться на его порядок).
Вот простой пример:
Dim sortedDict As New SortedDictionary(Of DateTime, String)
sortedDict.Add(DateTime.Now, "Foo")
Dim keys As SortedDictionary(Of DateTime, String).KeyCollection = sortedDict.Keys
Dim values As SortedDictionary(Of DateTime, String).ValueCollection = sortedDict.Values
Dim firstkey As DateTime = keys(0)
Dim firstValue As String = values(0)
Но я был удивлен, что вопрос спросил, что он не компилируется, тогда как он компилируется и работает для меня без проблем:
System.Diagnostics.Debug.WriteLine("Key:{0} Value:{1}", firstkey, firstValue) ' Key:04/29/2016 10:15:23 Value:Foo
Итак, почему я могу использовать его, как есть индекс, если на самом деле нет в SortedDictionary(Of TKey, TValue).KeyCollection
-class, а также нет в ValueCollection
. Оба реализуют ICollection<T>
, который является родительским интерфейсом IList<T>
. Таким образом, вы можете закодировать его, и оно имеет свойство Count
, но вы не можете получить доступ к элементам через индекс, как я выше.
Обратите внимание, что это новое консольное приложение без внутренних расширений. Я также не могу перейти к определению индексатора (также не с resharper). Почему это работает для меня?
Боковое примечание: в С# оно не работает. Я получаю ожидаемую ошибку компилятора:
Невозможно применить индексирование с [] к выражению типа 'SortedDictionary.KeyCollection'
var dict = new SortedDictionary<DateTime, string>();
dict.Add(DateTime.Now, "Foo");
DateTime dt = dict.Keys[0]; // here
Вот скриншот компиляции кода VB.NET: