DCSIMG
"Nullable object must have a value" - IIF statement in VB.NET - שלמה גולדברג (הרב דוטנט)

שלמה גולדברג (הרב דוטנט)

מרצה בסלע ויועץ בעולם ה - net.

"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), והאם יש דרך להפעיל אותה ?
 
אם מישהו יודע את התשובה, אשמח לשמוע על זה.
פורסם: Jun 02 2009, 03:40 PM by Shlomo | with 6 comment(s)
תגים:, , ,

תוכן התגובה

Avi Pinto כתב/ה:

מרגיז... האתר קרס בהגשת התגובה (כנראה שזה בגלל ה VB:))

המשפט הראשון של הפוסט מסכם את הכל: "vb.net זה רע,"

אין ב VB אופרטור ??

כדי שיהיה אפשר לרשום:

Dim i As Integer = j ?? 6

# June 2, 2009 7:57 PM

Shlomo כתב/ה:

באדיבות סשה (וגוגל)

www.panopticoncentral.net/.../20433.aspx

# June 2, 2009 9:30 PM

משה כתב/ה:

נורא פשוט

תשתמש ב"פונקציה" If במקום בפונקציה IIf

# June 3, 2009 8:50 AM

אריאל בן חורש כתב/ה:

VB זה דריק כולם יודעים.

אגב זה שאלה קלאסית ל-Stackoverflow, למה לא תשאל שם?

# June 3, 2009 6:32 PM

דני כתב/ה:

שלמה

אני מתכנת כבר המון שנים ב vb.net זו שפה מצוינת ותחזוקת הקוד שלה יותר קלה מ C#

# January 29, 2010 3:18 PM

Shlomo כתב/ה:

האמת - הצחקת אותי. (אבל זה עניין של טעם)

# January 30, 2010 7:16 PM
שלח תגובה

(שדה חובה)  

(שדה חובה)  

(אופציונלי)

(שדה חובה) 

Please add 5 and 7 and type the answer here:


Enter the numbers above: