Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лекции все вместе / Lektsia1_Vvedenie.doc
Скачиваний:
8
Добавлен:
20.04.2015
Размер:
357.89 Кб
Скачать

Неявные преобразования ссылочных типов

Существуют следующие неявные преобразования ссылочных типов:

Из любого ссылочного типа к object.

Из производного класса к базовому классу.

Из типа класса S к типу интерфейса T (где S реализует T).

Из типа интерфейса S к типу интерфейса T (где S является производным от T).

Из любого типа массива к System.Array и реализуемым им интерфейсам.

Из типа_массива S, который имеет тип элементов SE, к типу_ массива T, который имеет тип элементов TE, если выполняются следующие условия:

S и T различаются только по типу элементов. Другими словами, типы S и T имеют одинаковое число измерений.

SE и TE являются ссылочными_типами.

Существует неявное преобразование ссылочного типа из SE к TE.

Пример

using System;

namespace ConsoleApplication5

{

class Program

{

static void Main()

{

string[] t = new string[2] { "vv", "kkk" };

object[] tt = new object[2];

tt = t;

}

}

}

Пример

Если элемент массива ссылочного типа передается в качестве параметра ссылки или вывода, во время выполнения необходимо убедиться, что фактический тип элементов массива идентичен типу параметра.

using System;

namespace ConsoleApplication5

{

class Program

{

static void F(ref object x) { }

static void Main()

{

object[] a = new object[10];

object[] b = new string[10];

F(ref a[0]); // Ok

F(ref b[1]); // ArrayTypeMismatchException

}

}

}

Понятие упаковки и распаковки является ключевым в системе типов C#. С помощью данных операций осуществляется связь между типами значений и ссылочными типами за счет возможности преобразования любого значения типа значений к типу object и обратно.

Преобразования упаковки

Преобразование упаковки обеспечивает неявное преобразование типа значений в ссылочный тип.

из любого типа_значений к типу object. Пример.

int i = 123;

object box = i;

Явные преобразования

Выражение приведения типа используется для явного преобразования выражения в данный тип.

выражение_приведения_к_типу: ( тип ) унарное_выражение

Выражение_приведения_типа вида (T)E, где T является типом, а E —унарным_выражением, выполняет явное преобразование значения E в тип T.

Явные преобразования числовых типов.

Явные преобразования числовых типов предназначены для преобразования из одного числового_типа к другому числовому_типу, для которого не существует неявного преобразования:

  • из sbyte к byte, ushort, uint, ulong или char;

  • из byte к sbyte и char;

  • из short к sbyte, byte, ushort, uint, ulong или char;

  • из ushort к sbyte, byte, short или char;

  • из int к sbyte, byte, short, ushort, uint, ulong или char;

  • из uint к sbyte, byte, short, ushort, int или char;

  • из long к sbyte, byte, short, ushort, int, uint, ulong или char;

  • из ulong к sbyte, byte, short, ushort, int, uint, long или char;

  • из char к sbyte, byte или short;

  • из float к sbyte, byte, short, ushort, int, uint, long, ulong, char или decimal;

  • из double к sbyte, byte, short, ushort, int, uint, long, ulong, char, float или decimal;

  • из decimal к sbyte, byte, short, ushort, int, uint, long, ulong, char, float или double.

Пример. Для выполнения явного преобразования числового типа необходимо

заключить тип, в который производится преобразование (приведение), в скобки перед преобразуемым значением или переменной. Следующая программа выполнят приведение типа double в тип int.

using System;

namespace ConsoleApplication5

{

class Program

{

static void Main()

{

double x = 1234.7;

int a;

// Cast double to int.

a = (int)x;

System.Console.WriteLine(a);

}

}

}

Если x и y являются идентификаторами, то (x)y, (x)(y) и (x)(-y) являются выражениями приведения типа, а (x)-y не является, даже если x обозначает тип. Однако если x является ключевым словом, которое обозначает стандартный тип (например, int), то все четыре вида выражения являются выражениями приведения типа (потому что такое ключевое слово не может само быть выражением). Пример.

using System;

namespace ConsoleApplication5

{

class Program

{

static void Main()

{

double x = 1234.7;

int a;

// Cast double to int.

a = (int)-x;

System.Console.WriteLine(a);

}

}

}

Результат

Операторы checked и unchecked

Операторы checked и unchecked используются для управления контекстом проверки переполнения для арифметических операций и преобразований целого типа.

выражение_checked: checked ( выражение )

выражение_unchecked: unchecked ( выражение )

Оператор checked вычисляет содержащееся в нем выражение в проверяемом контексте.

Оператор unchecked — в непроверяемом. Используется для подавления проверки переполнения при выполнении арифметических операций и преобразований с данными целого типа. В непроверяемом контексте арифметическое переполнение будет проигнорировано, а результат усечен.

В контексте checked для неконстантных выражений (выражений, которые вычисляются во время выполнения), возникает исключение System.OverflowException.

Соседние файлы в папке лекции все вместе