מדריך NET. – המרות טבעיות בין טיפוסים (cast)
בשפת #C לאחר שמצהירים משתנה מסוג מסויים לא ניתן לאחסן בו ערכים מסוג אחר, אלא אם כן יש סוג שניתן להמרה לסוג של המשתנה. לדוגמה, משתנה מסוג int יכול לקבל ערכים מסוג short אך הוא אינו יכול לקבל ערכים מסוג string:
int numInt;
short numShort = 10;
string str = "Hello";
numInt = numShort; //OK
//Error: Cannot implicitly convert type 'string' to 'int'
numInt = str;
קיימות שתי אפשרויות עיקריות לביצוע המרה מטיפוס אחד לטיפוס אחר:
- implicit casting – המרה מרומזת ללא צורך בכתיבת ה- casting. מתבצעת אוטומטית ע”י המהדר.
- explicit casting – המרה מפורשת שבה חובה לבצע כתיבת ה- casting. מתבצעת ע”י המתכנת אשר מציין במפורש את סוג הטיפוס אליו הוא רוצה להמיר.
המרה מרומזת (implicit casting)
בהמרה מרומזת, אין צורך לציין את ההמרה, היא בטוחה ושום נתון לא יכול ללכת לאיבוד. היא מתבצעת אוטומטית בשני מקרים עיקריים:
1. המרה מטיפוס אחד (קטן) לטיפוס אחר (גדול) המסוגל להכיל בוודאות כל ערך מהטיפוס הראשון.
לדוגמא, המרה מרומזת של טיפוס מסוג short לטיפוס מסוג int. מיכוון שכל int (מספר שלם בין 2147483647 ל- 2147483648-) יכול לקבל כל ערך מסוג short (מספר שלם בין 32767 ל- 32768-). כפי שראינו בדוגמת הקוד הנ"ל.
// Implicit conversion. Long number can
// hold any value an int can hold, and more!
int num = 2147483647;
long bigNum = num;
2. המרה מטיפוס של מחלקה נגזרת לטיפוס של המחלקה ממנה הוא יורש. למשל, טיפוס מסוג מחלקת Employee יכול בצורה מרומזת להיות מומר לטיפוס ממחלקת הבסיס Person ממנה הוא יורש (מיכוון שכל עובד הוא בהכרח גם אדם).
Derived d = new Derived();
Base b = d; // Always OK.
הטבלה הבאה מפרטת את ההמרות המרומזות הקיימות בטיפוסים הבסיסיים ב- Net. :
טיפוס מקור | טיפוס יעד (אליו ניתן להמיר ללא צורך בהמרה מפורשת) |
sbyte | short, int, long, float, double, decimal |
byte | short, ushort, int, uint, long, ulong, float, double, decimal |
short | int, long, float, double, or decimal |
ushort | int, uint, long, ulong, float, double, decimal |
int | long, float, double, decimal |
uint | long, ulong, float, double, decimal |
long | float, double, decimal |
char | ushort, int, uint, long, ulong, float, double, decimal |
float | double |
ulong | float, double, decimal |
המרה מפורשת (explicit casting)
המרה מפורשת דורשת שימוש באופרטור ה-cast (סוגריים עגולים שבתוכם סוג המשתנה שאליו רוצים לבצע את ההמרה). סוג זה של המרה נדרש כאשר מידע יכול ללכת לאיבוד בזמן ההמרה או כשההמרה יכולה להסתיים בכישלון מסיבות שונות. לדוגמא, המרה של מספר לסוג קטן יותר או פחות מדוייק, או המרה של מופע ממחלקת בסיס למופע של המחלקה הנגזרת.
המרה מפורשת מ- double ל- int (שימו לב שבדוגמא זו אנחנו נאבד חלק מהדיוק של המספר, מיכוון שטיפוס היעד – int – אינו מאפשר להכיל חלק עשרוני):
double x = 1234.6;
int a;
a = (int)x; // Cast double to int
Console.WriteLine(a);
// Output: 1234
המרה מפורשת מ-Employee ל-Person (המרה של מופע ממחלקת בסיס למופע של המחלקה הנגזרת):
// Create a new derived type:
Employee e1 = new Employee();
// Implicit conversion to base type is safe:
Person p = e1;
// Explicit conversion is required to cast back
// to derived type.
Employee e2 = (Employee)p;
תגובות בפייסבוק