Sua compreensão é verdadeira. Isso parece tentar otimizar para mim. Você deve usar um elenco normal quando tiver certeza do tipo. Além de gerar uma exceção mais sensata, também falha rapidamente. Se você está errado sobre a sua suposição sobre o tipo, o programa irá falhar imediatamente e você será capaz de ver a causa da falha imediatamente em vez de esperar por um NullReferenceExceptionou ArgumentNullExceptionou mesmo um algum erro lógico no futuro. Em geral, uma asexpressão que não é seguida por uma nullverificação em algum lugar é um cheiro de código.
Por outro lado, se você não tem certeza sobre o elenco e espera que ele falhe, use-o em asvez de um elenco normal envolvido com um try-catchbloco. Além disso, asrecomenda-se o uso de uma verificação de tipo seguida por uma conversão. Ao invés de:
if (x is SomeType)
((SomeType)x).SomeMethod();
que gera uma isinstinstrução para a ispalavra - chave e uma castclassinstrução para o elenco (realizando o elenco duas vezes), você deve usar:
var v = x as SomeType;
if (v != null)
v.SomeMethod();
Isso gera apenas uma isinstinstrução. O método anterior possui uma falha em potencial em aplicativos multithread, pois uma condição de corrida pode fazer com que a variável mude de tipo após a isverificação ser bem-sucedida e falhar na linha de conversão. O último método não é propenso a esse erro.
A solução a seguir não é recomendada para uso em código de produção. Se você realmente odeia uma construção fundamental em C #, considere mudar para o VB ou algum outro idioma.
Caso alguém odeie desesperadamente a sintaxe do elenco, ele / ela pode escrever um método de extensão para imitar o elenco:
public static T To<T>(this object o) { // Name it as you like: As, Cast, To, ...
return (T)o;
}
e use uma sintaxe pura [?]:
obj.To<SomeType>().SomeMethod()