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