لماذا أحصل على خطأ "النوع لا يحتوي على معلومات كتابة" مع نوع التعداد

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

  •  07-07-2019
  •  | 
  •  

سؤال

لقد أعلنت عن نوع التعداد التالي الذي أريد أن يحصل فيه العضو الأول على القيمة الترتيبية 1 (واحد) بدلاً من القيمة المعتادة 0 (صفر):

  type
    TMyEnum = (
               meFirstValue = 1,
               meSecondValue,
               meThirdValue
              );

إذا اتصلت معلومات النوع (), ، على سبيل المثال.كجزء من الدعوة إلى GetEnumName(), ، أحصل على خطأ في المترجم:

  GetEnumName(TypeInfo(TMyEnum), Ord(aValue));

خطأ:"E2134:النوع 'TMyEnum' لا يحتوي على معلومات عن النوع"

لماذا هذا؟

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

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

المحلول 2

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

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

  type
    TMyEnum = (
                meNOTUSED1,   {= 0}
               meFirstValue,  {= 1} 
               meSecondValue,
               meThirdValue
              );

يمكن بعد ذلك استخدام النطاق الفرعي "لتصفية" القيمة الأولية غير المستخدمة:

   TValidMyEnum = meFirstValue..meThirdValue;

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

النطاق الفرعي ليس كافيًا إذا كان التعداد يحتوي على "فجوات":

  type
    TMyEnum = (
                meNOTUSED1,   {= 0}
               meFirstValue,  {= 1} 
               meSecondValue,
               meThirdValue,
                meNOTUSED2,
               meFinalValue   {= 5}
              );

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

  type
    TMyEnums = set of TMyEnum;

  const
    meNOTUSED      = [meUNUSED1, meUNUSED2]; //  .. etc as required
    meValidValues  = [Low(TMyEnum)..High(TMyEnum)] - meNOTUSED;


  if NOT (aValue in meValidValues) then
     // etc

نصائح أخرى

التعدادات غير المتقاربة والتعدادات التي لا تبدأ من الصفر لا تحتوي على معلومات الكتابة.لكي يتم تنفيذ typeinfo، يجب أن يكون بتنسيق مختلف عن tkEnumeration الموجود، وذلك بسبب مشكلات التوافق مع الإصدارات السابقة.

لقد فكرت في تنفيذ tkDiscontigiousEnumeration (أو ربما عضو أفضل اسمه) لـ Delphi 2010، لكن الفائدة بدت صغيرة بالنظر إلى ندرتها النسبية وصعوبات التعداد - كيف يمكنك تشفير النطاقات بكفاءة؟بعض الترميزات أفضل لبعض السيناريوهات، وأسوأ بالنسبة لسيناريوهات أخرى.

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