Существуют следующие неявные преобразования ссылочных типов:
Из любого ссылочного типа к 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), то все четыре вида выражения являются выражениями приведения типа (потому что такое ключевое слово не может само быть выражением). Пример.