מה קראתי ולא ידעתי :
נניח שיצרתי מערך של מחרוזות (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 הוא ערך, לא מצב!
לך תבנה מדינה…