Hello
Привет.
Я классический новичок.
Добро пожаловать на борт.
Я могу скомпилировать свою программу, но получить недопустимое исключение приведения при запуске программы
Оператор приведения часто означает «Я сообщаю компилятору, что это преобразование допустимо. Если я ошибаюсь, выдает недопустимое исключение приведения во время выполнения».
что не так с моим кодом. Я не знаю, что искать.
Ну, тогда вместо того, чтобы вручать вам рыбу - состав словаря недействителен - давайте научим вас ловить рыбу.
Скомпилируйте вашу программу в режиме отладки и запустите ее в отладчике. Отладчик должен сломаться в точном месте исключения. Затем вы можете проанализировать, что не так на этом конкретном сайте.
Если по какой-то причине вы не можете запустить свой код в отладчике, скомпилируйте вашу программу в режиме отладки и запустите ее в обычном режиме. Когда вы получаете исключение, посмотрите на часть «трассировки стека» исключения. В нем должен быть номер строки сайта исключения, чтобы вы могли затем изучить этот код.
И если по какой-то причине вы не можете этого сделать, используйте сообщение об исключении, чтобы попытаться выяснить это. «Недопустимое исключение приведения» подразумевает, что плохое поведение является результатом оператора приведения. В вашей программе есть два места, где используется оператор приведения. Существует явное использование в приведении словаря, и есть неявное использование в цикле foreach.
Многие удивляются, узнав о последнем. Когда вы говорите
foreach(Giraffe giraffe in animals)
это на самом деле означает «бросить каждое животное в списке животных к Жирафу и дать недопустимое исключение приведения, если одним из них является Тигр, Валлаби или что-то в этом роде». Это не значит «игнорировать всех животных, которые не являются жирафами» - если вы этого хотите, то скажите
foreach(Giraffe giraffe in animals.OfType<Giraffe>())
Проблема почти наверняка будет в одном из этих двух мест.