صب عدد خارج نطاق إلى التعداد في C # لا تنتج استثناء

StackOverflow https://stackoverflow.com/questions/618305

  •  03-07-2019
  •  | 
  •  

سؤال

والتعليمة البرمجية التالية لا ينتج استثناء ولكن بدلا من ذلك يمر قيمة 4 لتجارة الرقيق عبر الأطلسي. هل يستطيع أحد أن يفسر السبب وراء ذلك؟

 public enum testing
 { 
    a = 1,
    b = 2,
    c = 3
 }

testing tst = (testing)(4);
هل كانت مفيدة؟

المحلول

في C #، على عكس جافا، لا يتم فحصها تتضمن التعدادات. هل يمكن أن يكون أي قيمة من النوع الأساسي. هذا هو السبب في أنه من المهم جدا أن تحقق الإدخال.

if(!Enum.IsDefined(typeof(MyEnum), value))
     throw new ArgumentOutOfRangeException();

نصائح أخرى

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

وكل التعداد لديه نوع عددي الأساسي (مثل كثافة العمليات) التي يتم استخدامها لتمثيل. حتى إذا لم يكن لدى قيمة اسم، انها قيمة ممكنة في التعداد يمكن أن يكون.

وماذا البعض الآخر لم يقل: مع الصب، وكنت اقول المترجم أن تعرف ما تفعلونه. حتى إذا كنت أقول ذلك، وعلاج هذا كقيمة التعداد، فإنه لا. وأشارت ملصقات أخرى لماذا هذا مازال مسموحا، كما # مترجم C لا تسمح العديد من الأشياء السيئة، حتى لو يقول لك هل تعرف ما تفعلونه.

وسيكون سيئا للغاية إذا لم يسمح للقيمة، لأنه عندها لا يمكن حفظ قيمة العلم باعتبارها كثافة العمليات. أو كان شخص ما للتحقق ما إذا كانت كثافة العمليات هي واحدة من مجموعات المسموح بها، التي يمكن أن يكون هناك الكثير إذا كنت تستخدم التعداد العلم (مع القيم التي يمكن or'ed معا).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top