Преобразование типов
| 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 } |