Хорошо, это немного странно. Не обращайте внимания на то, что я пытаюсь сделать, и посмотрите на результат того, что происходит в этой ситуации.
Код:
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
, кажется, работает, но на самом деле нет.