כשאתה כותב row.ItemArray, ה-CLR קורא ל-get accessor של ItemArray. שם יש פרוצדורה פשוטה שעוברת על כל הערכים של השורה, ומעתיקה (כן כן, מעתיקה! בדוק ב-reflector...) אותם לתוך מערך object[] חדש. לכן, בשיטה עם ItemArray אתה לא מעדכן את השורה עצמה, אלא את המערך החדש הזה... השורה לא משתנה.
ItemArray זה למעשה כל השדות שבשורה, לא?, עכשיו אם זה נכון, אז לפי ההסבר שאמרת נניח כשאתה עושה השמה לשדה 0 בשורה אם הItemArray אז למעשה אין השמה,כלומר אין שום שינוי בשורה עצמה, רק בobject החדש,זה נכון?! עכשיו למעשה יש פה 2 מערכים?
סביר שה-CLR מבצע עושה כמה Castings כשאתה קורא למאפיין. אינך יודע איזה אובייקט יושב במחלקה מאחורי המאפיין ItemArray. בכל מקרה, זהו לא נושא להיות מוטרד בגינו.