مقارنة Nothing وصفر!!
هذا
مثال على المشاكل التي قد تحدث بسبب تفعيل التحويل التلقائي بين الأنواع Implicit Conversion:
عند مقارنة
كائن Object قيمته Nothing مع متغير قيمته صفر ستكون النتيجة True على عكس المتوقع جرب مثلا:
Dim Test As Object = Nothing
If Test = 0 Then MsgBox("Test = 0")
عند
تشغيل هذا الكود، ستظهر الرسالة التي تخبرك بأن قيمة المتغير Test تساوي 0، مع أن قيمته هي Nothing!!
(هذا
لا يحدث عند مقارنة Nothing مع أي
رقم آخر غير الصفر، لأان التحويل التلقائي يحول الكائن إلى صفر)
ولحل
هذه المشكلة، عليك إضافة شرط للتأكد أولا أن قيمة الكائن ليست Nothing:
If Test IsNot Nothing AndAlso Test = 0
Then
MsgBox("Test = 0")
End If
أو
يمكنك تحويل الكائن إلى عدد صحيح منعدم Nullable Integer
ثم إجراء عملية المقارنة عليه:
Dim I = CType(Test, Integer?)
If I = 0 Then MsgBox("Test =
0")
أما
لو أجريت عملية التحويل مباشرة في جملة الشرط، فعليك في هذه الحالة استخدام
الوسيلة Equals بدلا
من العلامة = وإلا فسيحدث نفس الخطأ:
If CType(Test, Integer?).Equals(0) Then
MsgBox("Test = 0")
End If
ولا
تسألوني لماذا يتصرف مترجم الكود بهذه الطريقة العجيبة.. سأرسل هذا الخطأ
لميكروسوفت لأرى ماذا يقولون عنه!
ملحوظة:
لا
يحدث خطأ مماثل في سي شارب، لأنها تمنع التحويل التلقائي، لهذا لا يمكنك أصلا أن
تكتب:
object
Test = null;
if (Test == 0)
MessageBox.Show("Test = 0");
لأن
مترجم الكون سيرفض المقارنة Test == 0.
كذلك
لو حولت الكائن إلى عدد صحيح منعدم، فلن يحدث خطأ في المقارنة ولن تظهر الرسالة:
object
Test = null;
if ((int?)Test == 0)
MessageBox.Show("Test = 0");
ليست هناك تعليقات:
إرسال تعليق
ملحوظة: يمكن لأعضاء المدونة فقط إرسال تعليق.