Исходный код вики Преобразование типов
Версия 1.1 от Alexandr Fokin на 2023/02/25 13:04
Последние авторы
| author | version | line-number | content |
|---|---|---|---|
| 1 | |(% style="width:138px" %)AS|(% style="width:869px" %)Выполняет попытку приведения к родительскому или дочернему типу (относительно типа переменной) интерфейсному типу. | ||
| 2 | В случае неудачи возвращает null, не выбрасывает ошибку|(% style="width:440px" %){{code language="c#"}}parentType p1 = childVar as parentType; | ||
| 3 | interfaceType p2 = instanceVar as interfaceType;{{/code}} | ||
| 4 | |(% style="width:138px" %)IS|(% style="width:869px" %)Проверяет является ли сущность определенным типом. | ||
| 5 | true/false.|(% style="width:440px" %){{code language="c#"}}bool p1 = childVar is parentType; | ||
| 6 | bool p2 = instanceVar is interfaceType; | ||
| 7 | |||
| 8 | if (instanceVar is interfaceType interfaceTypeVar) | ||
| 9 | { | ||
| 10 | interfaceTypeVar.InterfaceMethod(); | ||
| 11 | }{{/code}} | ||
| 12 | |(% style="width:138px" %)Upcasting and Dowcasting|(% style="width:869px" %)Также как и AS выполняет попытку приведения к типу, но в случае ошибки бросает Exception.|(% style="width:440px" %){{code language="none"}}parentType p1 = (parentType)childVar; | ||
| 13 | interfaceType p2 = (interfaceType)instanceVar;{{/code}} | ||
| 14 | |(% style="width:138px" %)implicit and explicit operator|(% style="width:869px" %)((( | ||
| 15 | Механизм который при вызове может выглядеть словно (Upcasting and Dowcasting), но на самом деле выполняющий преобразование одного типа в другой (подразумевает логику создания экземпляра целевого типа и наполнение его данными на основе переданной сущности). | ||
| 16 | В теле класса может быть определен метод как преобразование экземпляров класса в экземпляры внешнего типа, так и экземпляр внешнего типа в экземпляр класса. | ||
| 17 | \\Имеет определенные ограничения: например не позволяет указывать преобразования дочернего типа к родительскому иначе бы приводил к неоднозначности. | ||
| 18 | )))|(% style="width:440px" %){{code language="c#"}}class MyClass1 | ||
| 19 | { | ||
| 20 | public static implicit operator Type1 (MyClass1 instance) | ||
| 21 | { //... } | ||
| 22 | } | ||
| 23 | class MyClass2 | ||
| 24 | { | ||
| 25 | public static explicit operator Type1 (MyClass2 instance) | ||
| 26 | { //... } | ||
| 27 | } | ||
| 28 | |||
| 29 | static void Action(Type1 param){ // ... } | ||
| 30 | |||
| 31 | MyClass1 myClass1Var; | ||
| 32 | MyClass2 myClass2Var; | ||
| 33 | |||
| 34 | Action(myClass1Var); //implicit | ||
| 35 | Action((Type1)myClass1Var); //explicit | ||
| 36 | |||
| 37 | {{/code}} | ||
| 38 | |(% style="width:138px" %)Ограничения для Generic типов|(% style="width:869px" %) |(% style="width:440px" %){{code language="c#"}}interface Logic1 | ||
| 39 | { | ||
| 40 | //В случае struct приведет к упаковке | ||
| 41 | void Method1(ParameterInterfaceType param) | ||
| 42 | } | ||
| 43 | |||
| 44 | interface Logic2 | ||
| 45 | { | ||
| 46 | //В случае struct не будет упаковки, | ||
| 47 | //произойдет обычная передача параметра с копированием | ||
| 48 | void Method1<T>(T param) | ||
| 49 | where T : ParameterInterfaceType | ||
| 50 | }{{/code}} | ||
| 51 | |||
| 52 |