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に変更すると、同じエラーが発生します。
何か案は?
よろしく、タンバーグ