Explication de l'erreur d'Oslo M0197: Le 'texte' ne peut pas être utilisé dans un contexte de type & # 8221 ;?

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

  •  05-07-2019
  •  | 
  •  

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 ".)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top