تبدیل ضمنی

تبدیل ضمنی متغیرها یک نوع تبدیل است که به طور خودکار توسط کامپایلر انجام می‌شود. یک متغیر از یک نوع داده می‌تواند به طور ضمنی به یک نوع دیگر تبدیل شود به شرطی که مقدار آن از مقدار داده‌ای که می‌خواهد به آن تبدیل شود کمتر باشد. به عنوان مثال نوع داده‌ای byte می‌تواند مقادیر 0 تا 255 را در خود ذخیره کند و نوع داده‌ای int مقادیر 2147483648- تا 2147483647 را شامل می‌شود. پس می‌توانید یک متغیر از نوع byte را به یک نوع int تبدیل کنید :

byte number1 = 5;

int number2 = number1;

در مثال بالا مقدار number1 برابر 5 است در نتیجه متغیر number2 که یک متغیر از نوع صحیح است می‌تواند مقدار number1 را در خود ذخیره کند چون نوع صحیح از نوع بایت بزرگتر است. پس متغیر number1 که یک متغیر از نوع بایت است می‌تواند به طور ضمنی به number2 که یک متغیر از نوع صحیح است تبدیل شود. اما عکس مثال بالا صادق نیست.

int  number1 = 5;

byte number2 = number1;

در این مورد ما با خطا مواجه می‌شویم. اگر چه مقدار 5 متغیر number1 در محدوده مقادیر byte یعنی اعداد بین 255-0 قرار دارد اما متغیری از نوع بایت حافظه کمتری نسبت به متغیری از نوع صحیح اشغال می‌کند. نوع byte شامل 8 بیت یا 8 رقم دودویی است در حالی که نوع int شامل 32 بیت یا رقم باینری است. یک عدد باینری عددی متشکل از 0 و 1 است. برای مثال عدد 5 در کامپیوتر به عدد باینری 101 ترجمه می‌شود. بنابراین وقتی ما عدد 5 را در یک متغیر از نوع بایت ذخیره می‌کنیم عددی به صورت زیر نمایش داده می‌شود :

00000101

و وقتی آن را در یک متغیر از نوع صحیح ذخیره می‌کنیم به صورت زیر نمایش داده می‌شود :

00000000000000000000000000000101

بنابراین قرار دادن یک مقدار int در یک متغیر byte درست مانند این است که ما سعی کنیم که یک توپ فوتبال را در یک سوراخ کوچک گلف جای دهیم. برای قرار دادن یک مقدار int در یک متغیر از نوع byte می‌توان از تبدیل صریح استفاده کرد که در درسهای آینده توضیح داده می‌شود. نکته دیگری که نباید فراموش شود این است که شما نمی‌توانید اعداد با ممیز اعشار را به یک نوع int تبدیل کنید چون این کار باعث از بین رفتن بخش اعشاری این اعداد می‌شود.

double number1 = 5.25;

int number2 = number1; //Error

می‌توان یک نوع کاراکتر را به نوع ushort تبدیل کرد چون هر دو دارای طیف مشابهی از اعداد هستند. گرچه هر یک از آن‌ها کاملاً متفاوت توسط کامپایلر ترجمه می‌شوند. نوع char به عنوان یک کاراکتر و نوع ushort به عنوان یک عدد ترجمه می‌شود.

char charVar = 'c';
ushort shortVar = charVar;

Console.WriteLine(charVar);
Console.WriteLine(shortVar);
c
99

تبدیلاتی که کامپایلر به صورت ضمنی می‌تواند انجام دهد در جدول زیر آمده است :

نوع منبع توانایی تبدیل امن به
byte short, ushort, int, uint, long, ulong, float, double, decimal
sbyte short, int, long, float, double, decimal
short int, long, float, double, decimal
ushort int, uint, long, ulong, float, double, decimal
int long, float, double, decimal
uint long, ulong, float, double, decimal
long float, double, decimal
ulong float, double, decimal
float double
char ushort, int, uint, long, ulong, float, double, decimal

نکته‌ای دیگر که معمولاً ابهام بر انگیز است تعین نوع داده است. برای مثال ما چطور بدانیم که مثلاً عدد 7 از نوع int ،uint ،long یا ulong است؟ برای این کار باید کاراکترهایی را به انتهای اعداد اضافه کنیم.

uint number1 = 7U;
long number2 = 7L;
ulong number3 = 7UL;

در حالت پیشفرض و بدون قرار دادن کاراکتر در انتهای عدد کامپایلر عدد را از نوع صحیح (int) در نظر می‌گیرد. همچنین در حالت پیشفرض کامپایلر اعداد دسیمال (decimal) را اعداد double در نظر می‌گیرد. شما می‌توانید برای نشان دادن اعداد اعشاری float از کاراکتر F و برای نشان دادن اعداد دسیمال از کاراکتر M استفاده کنید.

double number1 = 1.23;
float number2 = 1.23F;
decimal number3 = 1.23M;