Преобразования типов в C#
Содержание
Что такое конверсии в C#?
Преобразование - это механизм преобразования значения одного типа в эквивалентное значение другого типа. Давайте рассмотрим ниже пример, чтобы лучше понять его.


1. var1 имеет тип short, 16-разрядное целое число со знаком, которое инициализировано на 5. var2 имеет тип sbyte, 8-разрядное целое число со знаком, которое инициализируется значением 10.
2. Затем значение var1 присваивается var2. Так как это два разных типа, значение var1 должно быть преобразовано в значение того же типа, что и var2, прежде чем выполнить назначение.
3. Если вы посмотрите на результат, значение var1 не изменится, а var2 будет иметь такое же значение, как var1.
Различные типы конверсий в C#
Мы обсудим различные типы конверсий в C#.
- Неявное преобразование
- Явное преобразование
- Пользовательское преобразование
Неявное преобразование:
- Компилятор автоматически выполняет эти преобразования
- При преобразовании из меньшего типа данных в более крупный тип, дополнительные наиболее значимые биты цели заполняются 0.
- Никакие данные не будут потеряны в Implicit Conversion
Пример:
class Program
{
static void Main(string[] args)
{
int a = 5;
Console.WriteLine(a);
//Неявное преобразование из a в b.
double b = a;
Console.WriteLine(b);
}
}
Вывод:
5
5
Явное преобразование:
- Когда вы конвертируете из более короткого типа в более длинный тип, для более длинного типа легко сохранить все биты более короткого типа, но при преобразовании из более длинного типа в более короткий тип целевого типа может оказаться несовместимым с исходным значением без потери данных.
- Это приводит к переполнению и потере данных
Пример:
class Program
{
static void Main(string[] args)
{
double a = 5;
Console.WriteLine(a);
// Неявное преобразование из a в b.
int b = (int) a;
Console.WriteLine(b);
}
}
Вывод:
5
5
В приведенном выше примере, когда мы попытаемся преобразовать double в int, нам нужно явно использовать, используя int else, мы получим ошибку.
Пользовательское преобразование:
- вы также можете определить как неявные, так и явные преобразования для ваших собственных классов и структур.
- Синтаксис одинаковый как для неявных, так и для явных объявлений преобразования, за исключением явных и явных ключевых слов.
- Требуются как публичные, так и статические модификаторы
Пример:
class Person
{
public string Name;
public int Age;
public Person(string name, int age)
{
Name = name;
Age = age;
}
public static implicit operator int(Person p) // Преобразование Person в int.
{
return p.Age;
}
public static implicit operator Person(int i) // Преобразование int в Person.
{
return new Person("Tina", i);
}
}
class Program
{
static void Main()
{
Person Person1 = new Person("Mike", 25);
int age = Person1;
Console.WriteLine("Person Info: {0}, {1}", Person1.Name, age);
Person Person2 = 35;
Console.WriteLine("Person Info: {0}, {1}", Person2.Name, Person2.Age);
}
}
Ограничения по пользовательскому преобразованию:
- Вы можете определять только определенные пользователем преобразования для классов и структур.
- Вы не можете переопределять стандартные неявные или явные преобразования.
- Для типа источника S и целевого типа T справедливы следующие значения:
- S и T должны быть разных типов.
- S и T не могут быть связаны наследованием. То есть S не может быть выведено из T, а T не может быть выведено из S.
- Ни S, ни T не могут быть интерфейсом или объектом типа.
- Оператор преобразования должен быть членом либо S, либо T. - Вы не можете объявить две конверсии, одну неявную и другую явную, с одинаковыми исходными и целевыми типами.
