ניסן

דברים שלא ידעתי ב-#C

מה קראתי ולא ידעתי :

נניח שיצרתי מערך של מחרוזות (string[]), ואתחלתי אותו עם שני איברים.

אח”כ יצרתי מערך של אובייקטים (object[]), והשמתי למערך של האובייקטים את המערך של המחרוזות.

בשלב הבא, השמתי לאיבר השני של מערך האובייקטים מספר (int).

לגיטימי מאד – מדובר במערך של אובייקטים, לא? ואכן, זה עובר קומפילציה.

אבל מתברר שזה לא לגיטימי – זה נופל בריצה.

אתם מוזמנים לבדוק בעצמכם:

154 string[] strings = new string[] { “Hello”, “World” };

155

156 //assign the string array to an object array

157 object[] objects = strings;

158

159 objects[0] = “Hi”; //OK

160 objects[1] = 123; //runtime exception

והקטע הזה פשוט הרג אותי. מייקרוסופט בהתגלמותה!
כידוע טיפוסי ערך אינם יכולים לקבל null. למשל int חייב לקבל מספר – int מוגדר להיות טיפוס שיכול לקבל ערכים בטווח מסויים, ו-null אינו נמצא בטווח הזה. אבל לפעמים ממש נוח ש-int יקבל null (לי זה קורה כשאני צריכה לדבר עם Stored Procedure. ב-SQL אין בעיה – פרמטר מסוג int יכול לקבל null, ולכן אני צריכה מקבילה בקוד למשתנה שיכול לקבל גם ערך מספרי וגם null).
אז אין בעיה – ישנם nullable types. משתנה מסוג ?int (כן, עם סימן שאלה צמוד אליו) יכול לקבל את כל טווח הערכים של int, וגם null.
אבל מתברר שה-null הזה הוא לא בדיוק מה שחשבנו. נניח שיש לנו משתנה מסוג ?int, בשם tmp. כעת נשים ל-tmp את הערך null. וכעת נכתוב ()tmp.ToString. מה יקרה?
הפתעה – אין שגיאת ריצה.
אבל איך? הרי המשתנה הוא null?
אז זהו שלא – עפ”י התיעוד של msdn, “טיפוס nullable יכול לייצג את טווח הערכים הנכון עבור הטיפוס שלו, ובנוסף גם את הערך null”.
כלומר במקרה הזה, null הוא ערך, לא מצב!
לך תבנה מדינה…

כתבו תגובה

כתובת הדוא"ל שלכם לא תוצג.