0

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

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

以下のコードをコンパイルすると、「M0197: 'Text' は Type コンテキストでは使用できません」というエラーが発生します。

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

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

アップデート:

混乱を招くために、次の例を考えてみましょう。これも問題なくコンパイルされます。

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

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

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

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

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

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

更新 2:

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

何か案は?

よろしく、タンバーグ

4

3 に答える 3

1

ここに問題があります: 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」のようなものが機能する理由を不思議に思うかもしれません。特別なルールがあります。フィールドの型割り当ての識別子は、フィールド自体を参照できません。この標準的な例は、「Address : Address」です。)

于 2009-01-31T19:23:00.763 に答える
1

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

Text : Text

そして、それを値のタイプに使用しようとしています:

Value : Text

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

于 2008-10-31T14:41:38.590 に答える
1

http://social.msdn.microsoft.com/Forums/en-US/oslo/thread/fcaf10a1-52f9-4ab7-bef5-1ad9f9112948

于 2008-10-31T21:01:06.840 に答える