El casting y la conversión de tipos son dos formas distintas de cambiar una expresión de un tipo de datos a otro.
Puedes hacer casting de una expresión 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 cumple, de forma trivial, en las estructuras).
Una alternativa al casting es la conversión de tipos mediante el operador is. Normalmente, esta se aplica a tipos de referencia y a 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 demasiado permisivo, ya que devolverá true para una clase y para cualquiera de las clases e interfaces de las que derive, directa o indirectamente. En este caso, la solución es typeof y 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
Nuestro club de fútbol football-match-reports está arrasando en las ligas, y te han invitado a hacer más trabajo, esta vez en el sistema de impresión de pases de seguridad.
La jerarquía de clases del personal de apoyo 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 se han validado 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 salvo que, si el miembro del personal pertenece al equipo de seguridad (ya sea de tipo Security o una de sus derivadas), entonces debe mostrarse el texto " Priority Personnel" 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 salvo que el texto " Priority Personnel" no debe mostrarse para las 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.