A conversão explícita e a conversão de tipos são duas formas diferentes de passar uma expressão de um tipo de dados para outro.
Uma expressão pode ser convertida para outro tipo com o operador de conversão (<type>).
long l = 1000L;
int i = (int)l;
object o = new Random();
Random r = (Random)o;
Se os tipos não forem compatíveis, é lançada uma instância de InvalidCastException. No caso dos números, isto indica que o tipo de destino não consegue representar o valor convertido. No caso das classes, um dos tipos tem de derivar do outro (o que também se aplica, de forma trivial, às structs).
Uma alternativa à conversão explícita é a conversão de tipos com o operador is. Esta aplica-se tipicamente a tipos de referência e a tipos anuláveis.
object o = new Random();
if (o is Random rand)
{
int ii = rand.Next();
// now, do something random
}
Se precisares de detetar o tipo exato de um objeto, o is pode ser demasiado permissivo, uma vez que devolve true para uma classe e para qualquer uma das classes e interfaces das quais ela deriva, direta ou indiretamente. Neste caso, a solução passa por typeof e Object.GetType().
object o = new List<int>();
o is ICollection<int> // true
o.GetType() == typeof(ICollection<int>) // false
o is List<int> // true
o.GetType() == typeof(List<int>) // true
O nosso clube de futebol football-match-reports está a subir nas ligas e foste convidado a fazer mais algum trabalho, desta vez no sistema de impressão de passes de segurança.
A hierarquia de classes do pessoal de bastidores é a seguinte
TeamSupport (interface)
├ Chairman
├ Manager
└ Staff (abstract)
├ Physio
├ OffensiveCoach
├ GoalKeepingCoach
└ Security
├ SecurityJunior
├ SecurityIntern
└ PoliceLiaison
Uma implementação completa da hierarquia é fornecida como parte do código-fonte do exercício.
Todos os dados passados ao criador de passes de segurança foram validados e é garantido que não são nulos.
Implementa o método SecurityPassMaker.GetDisplayName(). Deve devolver o valor do campo Title das instâncias de todas as classes derivadas de Staff e, caso contrário, "Too Important for a Security Pass".
var spm = new SecurityPassMaker();
spm.GetDisplayName(new Manager());
// => "Too Important for a Security Pass"
spm.GetDisplayName(new Physio());
// => "The Physio"
Modifica o método SecurityPassMaker.GetDisplayName(). Deve comportar-se como na Tarefa 1, exceto que, se o membro do pessoal pertencer à equipa de segurança (seja do tipo Security ou de um dos seus derivados), o texto " Priority Personnel" deve ser apresentado depois do título.
var spm = new SecurityPassMaker();
spm.GetDisplayName(new Physio());
// => "The Physio"
var spm2 = new SecurityPassMaker();
spm2.GetDisplayName(new Security());
// => "Security Team Member Priority Personnel"
spm2.GetDisplayName(new SecurityJunior());
// => "Security Junior Priority Personnel"
Modifica o método SecurityPassMaker.GetDisplayName(). Deve comportar-se como na Tarefa 2, exceto que o texto " Priority Personnel" não deve ser apresentado para instâncias do tipo SecurityJunior, SecurityIntern e PoliceLiaison.
var spm2 = new SecurityPassMaker();
spm2.GetDisplayName(new Security());
// => "Security Team Member Priority Personnel"
spm2.GetDisplayName(new SecurityJunior());
// => "Security Junior"
Inscreve-te no Exercism para aprenderes e dominares C# com 62 conceitos178 exercícios, e mentoria humana real, tudo grátis.