Explication de l'erreur d'Oslo M0197: Le 'texte' ne peut pas être utilisé dans un contexte de type & # 8221 ;?
Question
Dans Microsoft Oslo SDK CTP 2008 (à l'aide de Intellipad), le code suivant est bien compilé:
module M {
type T {
Text : Text;
}
}
lors de la compilation du code ci-dessous, l'erreur "M0197: le texte ne peut pas être utilisé dans un contexte de type"
module M {
type T {
Text : Text;
Value : Text; // error
}
}
Je ne vois pas la différence entre les exemples, comme dans le premier cas, le texte est également utilisé dans un contexte de type.
MISE À JOUR:
Pour ajouter à la confusion, considérons l'exemple suivant, qui compile également très bien:
module M {
type X;
type T {
X : X;
Y : X;
}
}
La spécification de langage M indique que:
Les déclarations de champ remplacent la portée lexicale pour empêcher le type de déclaration liant la déclaration elle-même. Le type attribué à une déclaration de champ ne doit pas être la déclaration elle-même; Cependant, la déclaration peut être utilisée dans une contrainte. Prenons l'exemple suivant:
type A; type B { A: A; }
Le champ englobant de manière lexicale pour l'attribution de type de la déclaration de champ A est la déclaration d'entité B. Sans exception, l'attribution de type A serait liée à la déclaration de champ dans une référence circulaire qui est une erreur. L'exception autorise la recherche lexicale à ignorer la déclaration de champ dans ce cas.
Il semble que les types définis par l'utilisateur et les types intégrés (intrinsèques) ne soient pas traités de la même manière.
UPDATE2:
Notez que Valeur dans l'exemple ci-dessus n'est pas un mot clé réservé. La même erreur se produit si vous renommez la Valeur en Y .
Des idées?
Cordialement, Tamberg
Autres conseils
D'après ce que je constate, vous avez redéfini le Texte
:
Text : Text
et vous essayez de l'utiliser pour le type de valeur:
Value : Text
ce qui n'est pas autorisé. Pourquoi utiliser un nom de type en tant que propriété redéfinit un type sur lequel je ne suis pas tout à fait clair (toujours en train de lire la spécification du langage M), mais je suis sûr qu'il y a une bonne raison à cela. Nommer simplement Text
quelque chose qui n’est pas déjà défini (l’échappement entre crochets ( [Text]
) ne fonctionne pas non plus).
Voici le problème: en M, vous pouvez faire des astuces comme celle-ci:
module M
{
type Address;
type Person
{
Addresses : Address*;
FavoriteAddress : Address where value in Addresses;
}
}
Dans cet exemple, " Adresses " fait référence à Person.Addresses. Le problème est donc que lorsque vous écrivez quelque chose d'inoffensif comme
module M
{
type T
{
Text : Text;
SomethingElse : Text;
}
}
... alors le " Texte " dans le type ascription for SomethingElse ne se réfère pas à Language.Text, mais à T.Text. Et c'est ce qui ne va pas. La solution consiste à l'écrire comme ceci:
module M
{
type T
{
Text : Text;
SomethingElse : Language.Text;
}
}
(Vous pouvez vous demander pourquoi des éléments tels que "Texte: Texte" fonctionnent dans l'exemple ci-dessus. Il existe une règle spéciale: les identificateurs dans l'attribution de type d'un champ ne peuvent pas faire référence au champ lui-même. L'exemple canonique pour cela est "Adresse: Adresse ".)