Я действительно просто поместил строковый тип данных в IEnumerable

Хорошо, это немного странно. Не обращайте внимания на то, что я пытаюсь сделать, и посмотрите на результат того, что происходит в этой ситуации.

Код:

static string rawNumbers="1,4,6,20,21,22,30,34";
static IEnumerable<int> numbers = null;

static void Main(string[] args)
{
    numbers = rawNumbers.Split(',').Cast<int>();

    for (int i = 0; i < numbers.Count(); i++)
    {
        //do something
    }

}

Ситуация:

Строка numbers = rawNumbers.Split (',') .Cast (); появляется для работы, и исключение не генерируется. Однако, когда я перебираю коллекцию, возникает исключение InvalidCastException.

Теперь перейдите к источнику и посмотрите на CastIterator . Кажется, это вызывается в для (int i = 0; i ... в частности numbers.Count ()

static IEnumerable<TResult> CastIterator<TResult>(IEnumerable source) {
    foreach (object obj in source) yield return (TResult)obj; 
}

Ошибка происходит в приведение, и когда я смотрю на данные в источнике varaible, это строка [].

Я мог подумать, что, поскольку строка, в которой я вызываю приведение к int, успешно выполнена, все в порядке. Что творится за занавеской? Действительно ли массив строк просто где-то хранится и не передается в T до тех пор, пока он не будет вызван? Возможно, ленивое приведение?


Я знаю, что не могу: (int) "42". Мои вопросы не в том, как заставить работать актерский состав, а в том, что происходит. Отложенное исполнение гипса? Кажется странным, что строка, в которой я вызываю Cast () , кажется, работает, но на самом деле нет.

8
задан 10 November 2010 в 20:29
поделиться