オスロエラーの説明“ M0197:「テキスト」はタイプコンテキストでは使用できません&#8221 ;?

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

  •  05-07-2019
  •  | 
  •  

質問

Microsoft Oslo SDK CTP 2008(Intellipadを使用)では、次のコードが正常にコンパイルされます。

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

以下のコードのコンパイル中にエラーが発生します" M0197: 'Text'は使用できませんTypeコンテキスト"

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

最初のケースではテキストがTypeコンテキストでも使用されているため、例の違いはわかりません。

更新:

混乱を増すために、次の例を検討してください。これも問題なくコンパイルされます。

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

M言語仕様には次のように記載されています:

  

フィールド宣言はレキシカルスコープをオーバーライドして、宣言の型が宣言自体にバインドされないようにします。フィールド宣言の割り当てられたタイプは、宣言自体であってはなりません。ただし、この宣言は制約で使用できます。次の例を考えてください:

     

タイプA;   タイプB {       A:A;   }

     

フィールド宣言Aの型表記の字句的に囲まれたスコープはエンティティ宣言Bです。例外なく、型表記Aはエラーである循環参照でフィールド宣言にバインドします。例外により、この場合、語彙検索でフィールド宣言をスキップできます。

ユーザー定義型と組み込み(組み込み)型は等しく扱われないようです。

UPDATE2:

上記の例のは予約キーワードではないことに注意してください。 Value の名前を Y に変更すると、同じエラーが発生します。

アイデアはありますか

よろしく、タンバーグ

他のヒント

あなたが見ているものから、 Text を再定義しました:

Text : Text

そして、あなたはそれをValueのタイプに使用しようとしています:

Value : Text

これは許可されていません。型名をプロパティとして使用すると、型が完全に明確にならない(M言語の仕様をまだ読み続けている)のに、なぜ型を再定義するのか、それには十分な理由があると確信しています。まだ定義されていないタイプの Text に名前を付けるだけです(括弧( [Text] )でエスケープしても機能しません)。

問題は次のとおりです。Mでは、次のようなトリックを実行できます。

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

その例では、" Addresses" Person.Addressesを参照します。問題は、次のような無害なものを書くときです

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

..."テキスト" SomethingElseの型表記では、Language.TextではなくT.Textを参照しています。そして、それが何が問題なのかです。回避策は次のように記述します:

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

(上記の例ではなぜ" Text:Text"のようなことが機能するのか疑問に思うかもしれません。特別なルールがあります。住所")

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top