オスロエラーの説明“ M0197:「テキスト」はタイプコンテキストでは使用できません&#8221 ;?
質問
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"のようなことが機能するのか疑問に思うかもしれません。特別なルールがあります。住所")