A primeira coisa a observar é que o VB.NET não tem um análogo direto ao (type)instancemecanismo de conversão do C # . Eu trago isso porque é útil como um ponto de partida na comparação dos dois operadores VB.NET (e eles são operadores, não funções, embora tenham semântica de função).
DirectCast()é mais estrito do que o operador de conversão C #. Ele só permite que você lance quando o item que está sendo lançado já é do tipo para o qual você está lançando. Eu acredito que ainda irá desempacotar os tipos de valor, mas caso contrário não fará nenhuma conversão. Portanto, por exemplo, você não pode converter de shortpara int, como faria com um (int)elenco C # . Mas você pode converter de um IEnumerablepara um array, se sua IEnumerablevariável de objeto subjacente realmente for um Array. E, claro, você pode converter de Objectpara qualquer coisa, assumindo que o tipo de sua instância de objeto realmente está em algum lugar abaixo do seu tipo de conversão na árvore de herança.
Isso é desejável porque é muito mais rápido . Há menos conversão e verificação de tipo necessárias.
CType()é menos estrito do que o operador de conversão C #. Ele fará coisas que você simplesmente não pode fazer com uma (int)conversão de estilo simples , como converter uma string em um inteiro. Ele tem tanto poder quanto chamar Convert.To___()em C #, onde ___é o tipo de destino de seu elenco.
Isso é desejável porque é muito poderoso. No entanto, esse poder tem um custo de desempenho; não é tão rápido quanto o DirectCast()operador de elenco do C # porque pode precisar de muito trabalho para terminar o elenco. Geralmente, você deve preferir DirectCast()quando puder.
Por fim, você perdeu um operador de conversão:, TryCast()que é um análogo direto do asoperador do C # .