Le cast et la conversion de type sont deux manières différentes de faire passer une expression d'un type de données à un autre.
On peut appliquer un cast à une expression pour la faire passer à un autre type avec l'opérateur de cast (<type>).
long l = 1000L;
int i = (int)l;
object o = new Random();
Random r = (Random)o;
Si les types ne sont pas compatibles, une instance de InvalidCastException est levée. Dans le cas des nombres, cela indique que le type de destination ne peut pas représenter la valeur convertie. Dans le cas des classes, l'un des types doit dériver de l'autre (cela vaut aussi, trivialement, pour les structures).
Une alternative au cast est la conversion de type, à l'aide de l'opérateur is. On l'applique généralement aux types de référence et aux types nullables.
object o = new Random();
if (o is Random rand)
{
int ii = rand.Next();
// now, do something random
}
Si tu as besoin de détecter le type précis d'un objet, is peut être un peu trop permissif, car il renvoie vrai pour une classe ainsi que pour toutes les classes et interfaces dont elle dérive, directement ou indirectement. typeof et Object.GetType() sont la solution dans ce cas.
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
Notre club de football football-match-reports est en pleine ascension dans les ligues, et on t'a invité à faire quelques travaux supplémentaires, cette fois sur le système d'impression des badges de sécurité.
La hiérarchie des classes de l'encadrement est la suivante :
TeamSupport (interface)
├ Chairman
├ Manager
└ Staff (abstract)
├ Physio
├ OffensiveCoach
├ GoalKeepingCoach
└ Security
├ SecurityJunior
├ SecurityIntern
└ PoliceLiaison
Une implémentation complète de la hiérarchie est fournie dans le code source de l'exercice.
Toutes les données transmises au générateur de badges de sécurité ont été validées et sont garanties non nulles.
Implémente la méthode SecurityPassMaker.GetDisplayName(). Elle doit renvoyer la valeur du champ Title des instances de toutes les classes dérivées de Staff et, sinon, "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"
Modifie la méthode SecurityPassMaker.GetDisplayName(). Elle doit se comporter comme dans la tâche 1, sauf que si le membre du personnel fait partie de l'équipe de sécurité (qu'il soit de type Security ou de l'une de ses classes dérivées), alors le texte " Priority Personnel" doit être affiché après le titre.
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"
Modifie la méthode SecurityPassMaker.GetDisplayName(). Elle doit se comporter comme dans la tâche 2, sauf que le texte " Priority Personnel" ne doit pas être affiché pour les instances de type SecurityJunior, SecurityIntern et PoliceLiaison.
var spm2 = new SecurityPassMaker();
spm2.GetDisplayName(new Security());
// => "Security Team Member Priority Personnel"
spm2.GetDisplayName(new SecurityJunior());
// => "Security Junior"
Inscris-toi sur Exercism pour apprendre et maîtriser C# avec 62 concepts178 exercices, et un vrai mentorat humain, le tout gratuitement.