كامل لماذا لا يؤدي نول== فالس إلى خطأ في الترجمة في c#؟




تمارين سي شارب (3)

هذا السؤال له إجابة هنا:

هذا ليس لحل أي مشكلة معينة. ببساطة سؤال المترجم.

لماذا لا تؤدي التعليمات البرمجية التالية إلى خطأ في الترجمة البرمجية؟ إنها تقارن نوع المرجع بنوع بدائي. يجب أن تفسر كل من لاغية وكاذبة إلى شيء للمترجم للقيام المقارنة. أو هو محلل ببساطة مسح لهذا النمط واستبدالها مع كاذبة؟

if(null == false) { }

انها قانونية لأن المشغل مقارنة رفع يستخدم. إذا قارنت bool إلى قيمة null ، يتم تحويل كل من Nullable<bool> ضمنا إلى Nullable<bool> ويتم استخدام مشغل المقارنة ل Nullable<bool> النهاية. يمكنك الحصول على تحذير لأنه من الواضح، هو دائما كاذبة.


وتنص الفقرة 7-10-6 من مواصفات اللغة (عوامل المساواة في نوع المرجع) على ما يلي:

يسمح x == null بنية x == null على الرغم من أن T يمكن أن يمثل نوع قيمة، ويتم تعريف النتيجة ببساطة لتكون كاذبة عندما T هو نوع القيمة.

ويتطلب هذا الحكم أن يكون null == false false ، وليس خطأ مترجم.


جواب تيجاس هو الصحيح. للتعامل بشكل أكثر تحديدا مع بعض النقاط:

لماذا لا تؤدي التعليمات البرمجية التالية إلى خطأ في الترجمة البرمجية؟

والمسألة ليست مسؤولة؛ فإنه لا ينتج خطأ لأنه قانون قانوني، ولكن هذا هو توتولوغي.

إذا كان سؤالك هو "أي قسم من مواصفات C # يجعل هذا قانوني؟"، ثم هذا سؤال قابل للإجابة. القسم المتعلق برفع مسؤلي المساواة يجعله قانونيا.

إنها تقارن نوع المرجع بنوع بدائي.

ليس. أولا، تجنب مصطلح "النوع البدائي"؛ والمواصفات لا تحدد بوضوح وأنها ليست مفهوما مفيدا في C #. كنت تقصد أن أقول أعتقد أنه يقارن قيمة نوع المرجع إلى قيمة نوع القيمة.

ثانيا، هذا ليس صحيحا. الحرف الحرفي الفارغ ليس من النوع المرجعي أو نوع القيمة؛ فإنه من أي نوع. وهي قابلة للتحويل إلى أي نوع قيمة لا يمكن إبطالها أو أي نوع مرجعي، ولكنها ليست من النوع وحده.

في هذه الحالة يتم تحويل الحرف الحرفي الفارغ إلى نوع البكرة الفارغ.

يجب أن تفسر كل من لاغية وكاذبة إلى شيء للمترجم للقيام المقارنة.

صيح. وتفسر على أنها بولس نولابل.

هو محلل ببساطة مسح لهذا النمط واستبدالها مع كاذبة؟

لا، ولكن هذا تخمين ممتاز. سوف مترجم ثابت أضعاف، على سبيل المثال، true == false إلى false ، لكنها لا تفعل التحسينات الطي التي تنطوي على أنواع قيمة لا يمكن إبطالها. يمكن إعادة تصميم اللغة لدعم الطي المستمر على العمليات مع نولابل القيمة نوع العمليات؛ كانت أنواع القيمة التي لا يمكن إلغاؤها في النسخة الأولى، من المحتمل أن تكون الميزة المقترحة مدعومة.







compiler-construction