La conversión explícita y la conversión de tipos son dos formas distintas de cambiar una expresión de un tipo de datos a otro.
Una expresión se puede convertir a otro tipo con el operador de conversión (<type>).
long l = 1000L;
int i = (int)l;
object o = new Random();
Random r = (Random)o;
Si los tipos no son compatibles, se lanza una instancia de InvalidCastException. En el caso de los números, esto indica que el tipo de destino no puede representar el valor convertido. En el caso de las clases, uno de los tipos debe derivar del otro (esto también se aplica, de forma trivial, a las estructuras).
Una alternativa a la conversión explícita es la conversión de tipos con el operador is. Por lo general, esta se aplica a los tipos de referencia y a los tipos anulables.
object o = new Random();
if (o is Random rand)
{
int ii = rand.Next();
// now, do something random
}
Si necesitas detectar el tipo exacto de un objeto, is puede resultar un poco permisivo, ya que devolverá true para una clase y para cualquiera de las clases e interfaces de las que esta derive, directa o indirectamente. typeof y Object.GetType() son la solución en este caso.
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
Nuestro club de fútbol football-match-reports está arrasando en las ligas, y te han invitado a hacer un poco más de trabajo, esta vez en el sistema de impresión de pases de seguridad.
La jerarquía de clases del personal del club es la siguiente
TeamSupport (interface)
├ Chairman
├ Manager
└ Staff (abstract)
├ Physio
├ OffensiveCoach
├ GoalKeepingCoach
└ Security
├ SecurityJunior
├ SecurityIntern
└ PoliceLiaison
Se proporciona una implementación completa de la jerarquía como parte del código fuente del ejercicio.
Todos los datos que se pasan al generador de pases de seguridad han sido validados y se garantiza que no son nulos.
Implementa el método SecurityPassMaker.GetDisplayName(). Debe devolver el valor del campo Title de las instancias de todas las clases derivadas de Staff y, en 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 el método SecurityPassMaker.GetDisplayName(). Debe comportarse como en la tarea 1, excepto que si el miembro del personal pertenece al equipo de seguridad (ya sea del tipo Security o de una de sus clases derivadas), entonces el texto " Priority Personnel" debe mostrarse después del 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 el método SecurityPassMaker.GetDisplayName(). Debe comportarse como en la tarea 2, excepto que el texto " Priority Personnel" no debe mostrarse para instancias de tipo SecurityJunior, SecurityIntern y PoliceLiaison.
var spm2 = new SecurityPassMaker();
spm2.GetDisplayName(new Security());
// => "Security Team Member Priority Personnel"
spm2.GetDisplayName(new SecurityJunior());
// => "Security Junior"
Regístrate en Exercism para aprender y dominar C# con 62 conceptos178 ejercicios y mentoría humana real, todo gratis.