شرح خطأ أوسلو "M0197:" النص "لا يمكن استخدامه في سياق النوع"؟

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

  •  05-07-2019
  •  | 
  •  

سؤال

في Microsoft Oslo SDK CTP 2008 (باستخدام Intellipad) ، يجمع الرمز التالي بشكل جيد:

module M {
    type T {
        Text : Text;
    }
}

أثناء تجميع الرمز أدناه يؤدي إلى الخطأ "M0197:" النص "لا يمكن استخدامه في سياق النوع"

module M {
    type T {
        Text : Text;
        Value : Text; // error
    } 
}

لا أرى الفرق بين الأمثلة ، كما هو الحال في نص الحالة الأول يستخدم أيضًا في سياق النوع.

تحديث:

للإضافة إلى الارتباك ، فكر في المثال التالي ، والذي يجمع أيضًا بشكل جيد:

module M {
    type X;
    type T {
      X : X;
      Y : X;
    } 
}

تنص مواصفات لغة M على ما يلي:

تخطي الإعلانات الميدانية النطاق المعجمي لمنع نوع الإعلان الملزم بالإعلان نفسه. يجب ألا يكون النوع المنسوب من إعلان الحقل هو الإعلان نفسه ؛ ومع ذلك ، يمكن استخدام الإعلان في قيد. النظر في المثال التالي:

نوع أ؛ اكتب ب {a: a ؛ }

إن النطاق المرفق المعجمي لنوع ASCIPTION من إعلان الحقل A هو إعلان الكيان B. مع عدم وجود استثناء ، فإن النوع AS -AS -DISCRIPTION يرتبط بإعلان الحقل في مرجع دائري وهو خطأ. الاستثناء يسمح لبحث معجمي بتخطي إعلان المجال في هذه الحالة.

يبدو أن الأنواع المحددة للمستخدم والأنواع المدمجة (الجوهرية) لا تعامل معاملة متساوية.

Update2:

لاحظ أن قيمة في المثال أعلاه ، ليست كلمة رئيسية محجوزة. نفس الخطأ ينتج عنه إعادة تسمية قيمة إلى ذ.

أيه أفكار؟

التحيات ، تامبرج

نصائح أخرى

من ما أراه قد أعيد تعريفه Text:

Text : Text

ثم تحاول استخدامه لنوع القيمة:

Value : Text

وهو غير مسموح به. لماذا يعيد استخدام اسم النوع كخاصية تعريف نوع لست واضحًا تمامًا (لا يزال يقرأ مواصفات لغة M) ، لكنني متأكد من وجود سبب وجيه لذلك. مجرد اسم Text شيء ليس بالفعل نوعًا محددًا (يهرب منه بأقواس ([Text]) لا يعمل أيضًا).

إليكم المشكلة: في M ، يمكنك القيام بالحيل مثل هذه:

module M
{
  type Address;
  type Person
  {
    Addresses : Address*;
    FavoriteAddress : Address where value in Addresses;
  }  
}

في هذا المثال ، يشير "العناوين" إلى الشخص. المشكلة ، إذن ، هي أنه عندما تكتب شيئًا غير ضار

module M
{
  type T
  {
    Text : Text;
    SomethingElse : Text;
  }
}

... ثم "النص" في النوع Ascription for the tomesselse لا يشير إلى language.text ، ولكن إلى t.text. وهذا ما يحدث. الحل البديل هو كتابته مثل هذا:

module M
{
  type T
  {
    Text : Text;
    SomethingElse : Language.Text;
  }
}

(قد تتساءل لماذا تعمل أشياء مثل "النص: النص" في المثال أعلاه. هناك قاعدة خاصة: المعرفات في نوع الحقل لا يمكن أن تشير إلى الحقل نفسه. المثال الكنسي لهذا هو "العنوان: العنوان".

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