Ответ 1
Причина в том, что CType
и DirectCast
являются принципиально разными операциями.
DirectCast
- это механизм кастинга в VB.Net, который позволяет использовать только определенные CLR преобразования. Это еще более ограничивает, чем версия С# для кастинга, потому что она не учитывает определенные пользователем преобразования.
CType
является лексическим механизмом литья. Он рассматривает правила CLR, определенные пользователем преобразования и определенные преобразования VB.Net. Короче говоря, он сделает все возможное, чтобы создать допустимое преобразование для объекта к указанному типу.
В этом конкретном случае вы пытаетесь преобразовать значение в Enum, у которого нет определенного преобразования CLR, и, следовательно, он не работает. Однако во время выполнения VB.Net удалось найти лексическое преобразование, чтобы удовлетворить эту проблему.
Здесь существует достойное обсуждение различий: