Исходный код вики Преобразование типов

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

Последние авторы
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