Конверзије типова
У програмском језику C# могуће је вршити конверзије између било која два нумеричка типа - имплицитно или експлицитно. Експлицитне конверзије врше се каст изразима (енгл. Cast Expression) облика (T)E, где је E израз, а T жељени тип. На пример:
Имплицитне конверзије
У следећој табели приказане су све предефинисане имплицитне конверзије између нумеричких типова:
| из | у |
|---|---|
sbyte | short, int, long, float, double, decimal или nint |
byte | short, ushort, int, uint, long, ulong, float, double, decimal, nint или nuint |
short | int, long, float, double, decimal или nint |
ushort | int, uint, long, ulong, float, double, decimal, nint или nuint |
int | long, float, double, decimal или nint |
uint | long, ulong, float, double, decimal или nuint |
long | float, double или decimal |
ulong | float, double или decimal |
float | double |
nint | long, float, double или decimal |
nuint | ulong, float, double или decimal |
Ако се у програму врше имплицитне конверзије, онда требаш водити рачуна о губитку прецизности. Имплицитне конверзије из типова int, uint, long, ulong, nint или nuint у тип float, односно из типова long, ulong, nint или nuint у тип double могу да доведу до губитка прецизности, али не и до губитка реда величине. На пример:
Остале имплицитне конверзије не могу да доведу до губитка прецизности.
У програмском језику C# нису дефинисане имплицитне конверзије у типове byte и sbyte, као ни имплицитне конверзије из типова double и decimal. Нису дефинисане ни имплицитне конверзије између типа decimal и типова float и double.
Експлицитне конверзије
У следећој табели приказане су све предефинисане експлицитне конверзије између нумеричких типова, за које нису дефинисане имплицитне конверзије:
| из | у |
|---|---|
sbyte | byte, ushort, uint, ulong или nuint |
byte | sbyte |
short | sbyte, byte, ushort, uint, ulong или nuint |
ushort | sbyte, byte или short |
int | sbyte, byte, short, ushort, uint, ulong или nuint |
uint | sbyte, byte, short, ushort, int или nint |
long | sbyte, byte, short, ushort, int, uint, ulong, nint или nuint |
ulong | sbyte, byte, short, ushort, int, uint, long, nint или nuint |
float | sbyte, byte, short, ushort, int, uint, long, ulong, decimal, nint или nuint |
double | sbyte, byte, short, ushort, int, uint, long, ulong, float, decimal, nint или nuint |
decimal | sbyte, byte, short, ushort, int, uint, long, ulong, float, double, nint или nuint |
nint | sbyte, byte, short, ushort, int, uint, ulong или nuint |
nuint | sbyte, byte, short, ushort, int, uint, long или nint |
Експлицитне конверзије могу да доведу до губитка података или грешака "преливања", ако тип који се конвертује (изворни тип) није у опсегу типа у који се конвертује (одредишни тип). Ако је изворни тип већи од одредишног, онда се изворна вредност скраћује одбацивањем њених додатних најважнијих битова. Ако је изворни тип мањи од одредишног, онда се изворна вредност проширује или знаком или нулама, тако да одговара величини одредишног типа. Ако је изворни тип исте величине као и одредишни, онда се изворна вредност третира као одредишна вредност.
Ако се тип decimal конвертује у неки целобројни тип, изворна вредност се заокружује. Ако је заокружена изворна вредност ван опсега одредишне вредности, долази до грешке "преливања". Ако се типови float или double конвертују у неки целобројни тип, изворна вредност се такође заокружује. Ако је заокружена изворна вредност ван опсега одредишне вредности, долази до грешке ""преливања" или је резултат неодређена вредност типа одредишта.
Ако се тип double конвертује у тип float, изворна вредност се заокружује на најближу одредишну вредност. Ако је изворна вредност премала или превелика да стане у одредишну, резултат је нула или бесконачно. Ако се типови float или double конвертују у тип decimal, изворна вредност се конвертује у одредишну и заокружује на најближи број до двадесетосме децимале. Ако је изворна вредност премала, онда је резултат нула, односно, ако је изворна вредност превелика долази до грешке "преливања". На крају, ако се тип decimal конвертује у типове float или double, изворна вредност се заокружује на најближу одредишну вредност.