Приведение типов (casting) в C# позволяет преобразовывать объекты одного типа в другой. В этом контексте различают UpCast (приведение вверх) и DownCast (приведение вниз).
UpCast (приведение вверх)
UpCast — это преобразование объекта производного класса в базовый тип. Такое преобразование всегда безопасно и выполняется неявно.
Пример UpCast
using System;
class Animal
{
public void Speak() => Console.WriteLine("Animal sound");
}
class Dog : Animal
{
public void Bark() => Console.WriteLine("Woof");
}
class Program
{
static void Main()
{
Dog dog = new Dog();
Animal animal = dog; // UpCast (неявное приведение)
animal.Speak(); // Animal sound
}
}
В этом примере объект dog
приводится к типу Animal
. Это возможно, потому что Dog
является наследником Animal
.
DownCast (приведение вниз)
DownCast — это приведение объекта базового типа к производному. Такое преобразование может быть небезопасным, так как базовый класс не обязательно является экземпляром производного. Поэтому в C# требуется явное приведение.
Пример DownCast
using System;
class Animal
{
public void Speak() => Console.WriteLine("Animal sound");
}
class Dog : Animal
{
public void Bark() => Console.WriteLine("Woof");
}
}
class Program
{
static void Main()
{
Animal animal = new Dog(); // UpCast
Dog dog = (Dog)animal; // DownCast (явное приведение)
dog.Bark(); // Woof
}
}
В этом примере объект animal
, который на самом деле является Dog
, приводится обратно к Dog
, что позволяет вызвать метод Bark()
.
Использование is
и as
для безопасного DownCast
Так как DownCast может привести к исключению InvalidCastException
, можно использовать операторы is
и as
для безопасного приведения.
Пример с is
Animal animal = new Dog();
if (animal is Dog dog)
{
dog.Bark();
}
Пример с as
Animal animal = new Dog();
Dog dog = animal as Dog;
if (dog != null)
{
dog.Bark();
}
Оператор is
проверяет, совместим ли объект с типом, а as
выполняет приведение, но возвращает null
, если оно невозможно, избегая исключений.