Il casting e la conversione di tipo sono due modi diversi di trasformare un'espressione da un tipo di dati a un altro.
Si può fare il cast di un'espressione verso un altro tipo con l'operatore di cast (<type>).
long l = 1000L;
int i = (int)l;
object o = new Random();
Random r = (Random)o;
Se i tipi non sono compatibili, viene lanciata un'istanza di InvalidCastException. Nel caso dei numeri, questo indica che il tipo ricevente non può rappresentare il valore convertito. Nel caso delle classi, uno dei tipi deve derivare dall'altro (cosa che vale, banalmente, anche per le struct).
Un'alternativa al casting è la conversione di tipo tramite l'operatore is. Questa viene in genere applicata ai tipi di riferimento e ai tipi nullable.
object o = new Random();
if (o is Random rand)
{
int ii = rand.Next();
// now, do something random
}
Se devi rilevare il tipo preciso di un oggetto, is può essere un po' troppo permissivo, perché restituisce true per una classe e per qualunque classe o interfaccia da cui essa derivi, direttamente o indirettamente. In questo caso, la soluzione è 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
Il nostro club di calcio football-match-reports sta andando alla grande nei campionati, e ti hanno invitato a fare ancora un po' di lavoro, questa volta sul sistema di stampa dei pass di sicurezza.
La gerarchia delle classi del personale di supporto è la seguente
TeamSupport (interface)
├ Chairman
├ Manager
└ Staff (abstract)
├ Physio
├ OffensiveCoach
├ GoalKeepingCoach
└ Security
├ SecurityJunior
├ SecurityIntern
└ PoliceLiaison
Un'implementazione completa della gerarchia è fornita come parte del codice sorgente dell'esercizio.
Tutti i dati passati al generatore di pass di sicurezza sono stati validati e sono garantiti non nulli.
Implementa il metodo SecurityPassMaker.GetDisplayName(). Deve restituire il valore del campo Title per le istanze di tutte le classi derivate da Staff e, in caso contrario, «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 il metodo SecurityPassMaker.GetDisplayName(). Deve comportarsi come nel punto 1, con la differenza che, se il membro dello staff fa parte del team di sicurezza (di tipo Security o di una delle sue classi derivate), dopo il titolo deve comparire il testo « Priority Personnel».
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 il metodo SecurityPassMaker.GetDisplayName(). Deve comportarsi come nel punto 2, con la differenza che il testo « Priority Personnel» non deve comparire per le istanze di tipo SecurityJunior, SecurityIntern e PoliceLiaison.
var spm2 = new SecurityPassMaker();
spm2.GetDisplayName(new Security());
// => "Security Team Member Priority Personnel"
spm2.GetDisplayName(new SecurityJunior());
// => "Security Junior"
Iscriviti a Exercism per imparare e padroneggiare C# con 62 concetti178 esercizi e il mentoring di persone reali, tutto gratis.