Преобразование типов

Версия 1.3 от Alexandr Fokin на 2023/02/25 13:09

ASВыполняет попытку приведения к родительскому или дочернему типу (относительно типа переменной) интерфейсному типу.
В случае неудачи возвращает null, не выбрасывает ошибку
parentType p1 = childVar as parentType;
interfaceType p2 = instanceVar as interfaceType;
ISПроверяет является ли сущность определенным типом.
true/false.
bool p1 = childVar is parentType;
bool p2 = instanceVar is interfaceType;

if (instanceVar is interfaceType interfaceTypeVar)
{
  interfaceTypeVar.InterfaceMethod();
}
Upcasting and DowcastingТакже как и AS выполняет попытку приведения к типу, но в случае ошибки бросает Exception.​parentType p1 = (parentType)childVar;
interfaceType p2 = (interfaceType)instanceVar;​
implicit and explicit operator

Механизм который при вызове может выглядеть словно (Upcasting and Dowcasting), но на самом деле выполняющий преобразование одного типа в другой (подразумевает логику создания экземпляра целевого типа и наполнение его данными на основе переданной сущности).
В теле класса может быть определен метод как преобразование экземпляров класса в экземпляры внешнего типа, так и экземпляр внешнего типа в экземпляр класса.

Имеет определенные ограничения: например не позволяет указывать преобразования дочернего типа к родительскому иначе бы приводил к неоднозначности.

Во многих случаях лучше явно реализовать модуль преобразования в виде компонента бизнес логики (Converter / Transformator), а не использовать данных механизм.

class MyClass1
{
 public static implicit operator Type1 (MyClass1 instance)
  { //... }  
}
class MyClass2
{
 public static explicit operator Type1 (MyClass2 instance)
  { //... }
}

static void Action(Type1 param){ // ... }

MyClass1 myClass1Var;
MyClass2 myClass2Var;

Action(myClass1Var); //implicit
Action((Type1)myClass1Var); //explicit
Ограничения для Generic типов interface Logic1
{
 //В случае struct приведет к упаковке
 void Method1(ParameterInterfaceType param)
}

interface Logic2
{
 //В случае struct не будет упаковки,
 //произойдет обычная передача параметра с копированием
 void Method1<T>(T param)
   where T : ParameterInterfaceType
}