سؤال

خذ بعين الاعتبار العبارات التالية:

int? v1 = null;

int? v2 = 5 * v1;

ما هي قيمة v2? (null أو سلسلة فارغة؟)

كيف يمكنني منع المترجم من وضع علامة عليها كعملية غير صالحة؟هل أحتاج إلى اتباع معالجة الاستثناءات المخصصة؟

هل كانت مفيدة؟

المحلول

إنه null.

C # مواصفات اللغة 3.0 (القسم §7.2.7: مشغلو رفعوا)

للمشغلين الثنائية + - * / % & | ^ << >> :

يوجد شكل مرفوع للمشغل إذا كانت المعامل وأنواع النتائج جميع أنواع القيمة غير الظهيرة. يتم بناء النموذج المرفوع عن طريق إضافة واحدة ? معدل لكل معامل ونوع النتيجة. المشغل مرفوع ينتج null القيمة إذا كانت واحدة أو كلا المعاملتين null (استثناء يجري & و | مشغلي bool? اكتب، كما هو موضح في الفقرة 7.10.3). خلاف ذلك، فإن المشغل المرفوع لا يعمل المعاملات، وهو ينطبق المشغل الأساسي، ويغطي النتيجة.


كيف يمكنني منع المترجم لوضع علامة عليه كعمل غير صالح؟ هل أحتاج إلى اتباع معالجة استثناء مخصص؟

انها ليست عملية غير صالحة. لن يرمي استثناء حتى لا تحتاج إلى التعامل مع الاستثناءات في هذه الحالة.

نصائح أخرى

إذا كنت تريد منع العملية من قبل المحول البرمجي، فقم بإجراء المتغير الثاني غير الظهور. ثم سوف تضطر إلى الكتابة:

int v2 = 5 * v1.Value;

سيقوم هذا بإلقاء استثناء في وقت التشغيل إذا كان V1 فارغا.

ستكون قيمتها "فارغة"، في هذا السياق على الأقل يمكن اعتبارها هي نفس قاعدة البيانات NULL، أي بدلا من لا شيء، أو صفر، فهذا يعني "غير معروف". لا تزال خمسة الكثير من المجهول غير معروفة، كما أنها لن تكون أيضا "سلسلة فارغة" لأنك تتعامل مع الأرقام، وليس سلاسل.

لست متأكدا مما تقصد به "كيف يمكنني منع المترجم لوضع علامة عليه كعمل غير صالح؟" كما يتجمع هذا الرمز ويصعد بشكل جيد بالنسبة لي تحت Visual Studio 2008 =)

لست متأكدًا مما تحاول القيام به، ولكن إذا كنت تريد أن يكون v2 فارغًا إذا كان v1 فارغًا، فيجب عليك اختبار ما إذا كان v1 له قيمة قبل استخدامه.

int? v2 = v1.HasValue ? 5 * v1.Value : null;

أو

int? v2 = null;
if (v1.HasValue) { v2 = 5 * v1.Value; }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top