"Nullable object must have a value" - IIF statement in VB.NET
vb.net זה רע,
אני נמצא כרגע בחברה מסוימת שלדאבוני כל הקוד שלהם הוא ב - vb.net ולא ב - #C, (הדבר היחיד הטוב שיוצא לי מזה, שאני יכול לכתוב בקורות חיים שיש לי גם נסיון ב - vb.net :) )
בכל מקרה יצא לי להיתקל בקוד הבא: (בערך)
Dim j As Integer? = Nothing
Dim i As Integer = IIf(j.HasValue, j.Value, 6)
Console.WriteLine(i)
אם היינו משווים את הקוד הזה ל - #C זה היה נראה ככה:
int? j = null;
int i = j.HasValue ? j.Value : 6;
Console.WriteLine(i);
בפועל במקרה ש - j היה null תמיד היה נזרק שגיאה של "Nullable object must have a value". אף על פי שלכאורה אנחנו לא ניגשים ל - value
מה מסתבר, שהקריאה ל - IIf היא לא מילה שמורה, אלא קריאה לפונקציה שיושבת תחת Microsoft.VisualBasic.Interaction ולמעשה הקוד שלה נראה כך: (בתרגום ל - #C)
public static object IIf(bool Expression, object TruePart, object FalsePart)
{
if (Expression)
{
return TruePart;
}
return FalsePart;
}
וכמובן נסיון להפעיל את הפונקציה גוררת נסיון לגשת ל - value של ה - nullable, (כדי לשלוח אותו ל - TruePart) מה שכמובן יגרום לשגיאה במידה וזה null.
מסקנה: אסור להשתמש ב - IIf כשגישה לאחד התוצאות האפשריות יכול לגרום לשגיאה.
מה שאני לא מבין, ואני משאיר את זה כשאלה פתוחה, אם אני מסתכל על הקוד של ה - #C ב - reflector, אני רואה שיש לו פקודות ב - IL עבור המשפט ? :
במידה ואני מנסה להפוך את זה ל - VB (ב - reflector) הוא מזהה את קוד ה - IL כמשפט IIf (והוא צובע את ה - IIf בצבע כחול - כלומר מילה של השפה)
אז היכן היא הפונקציה IIf של השפה (המילה השמורה זאת שאמורה להתרגם מקוד ה - IL), והאם יש דרך להפעיל אותה ?
אם מישהו יודע את התשובה, אשמח לשמוע על זה.