Erklärung von Oslo Fehlern „M0197:‚Text‘kann nicht in einem Typ-Kontext verwendet werden“?
Frage
In Microsoft Oslo SDK CTP 2008 (mit IntelliPad) der folgende Code kompiliert fein:
module M {
type T {
Text : Text;
}
}
, während die unter Kompilieren von Code führt zu dem Fehler „M0197:‚Text‘kann nicht in einem Typ-Kontext verwendet werden“
module M {
type T {
Text : Text;
Value : Text; // error
}
}
Ich sehe nicht den Unterschied zwischen den Beispielen, wie im ersten Fall Text auch in einer Art Kontext verwendet wird.
UPDATE:
, um die Verwirrung hinzuzufügen, betrachten Sie das folgende Beispiel, das auch in Ordnung kompiliert:
module M {
type X;
type T {
X : X;
Y : X;
}
}
Die M-Sprachspezifikation lautet:
Feld Erklärungen außer Kraft setzen lexikalische Scoping den Typen einer Erklärung an die Erklärung selbst verbindlich zu verhindern. Die zugeschriebene Art einer Felddeklaration darf nicht die Erklärung selbst; jedoch kann die Erklärung in einem Constraint verwendet werden. Betrachten Sie das folgende Beispiel:
Typ A; Typ B { A: A; }
Der lexikalisch umschließenden Umfang für den Typen Zuschreibung der Erklärung Eines Feldes ist die Entitätsdeklaration B. Ohne Ausnahme, bindet die Art ascription A würde in einer kreisförmigen Bezugnahme auf die Felddeklaration, die ein Fehler vorliegt. Die Ausnahme erlaubt lexikalischen Nachschlag die Felddeklaration in diesem Fall zu überspringen.
Es scheint, dass Benutzertypen definiert und integrierten (intrinsische) Typen werden nicht gleich behandelt werden.
UPDATE2:
Beachten Sie, dass Wert in dem obigen Beispiel ist nicht ein reserviertes Schlüsselwort. Die gleichen Fehler auf, wenn Sie umbenennen Wert Y .
Irgendwelche Ideen?
Regards, Tamberg
Andere Tipps
Von dem, was ich sehe Sie neu definiert Text
haben:
Text : Text
und dann versuchen Sie es für die Art von Wert zu verwenden:
Value : Text
das ist nicht erlaubt. Warum einen Typnamen als eine Eigenschaft, eine Art definiert Ich bin nicht ganz klar (noch M-Sprachspezifikation zu lesen), aber ich bin sicher, es gibt einen guten Grund dafür. Nennen Sie Text
etwas, das nicht bereits eine definierte Art (Entkommen mit Klammern ([Text]
) funktioniert auch nicht).
Hier ist das Problem: in M, können Sie Tricks, wie dies tun:
module M
{
type Address;
type Person
{
Addresses : Address*;
FavoriteAddress : Address where value in Addresses;
}
}
In diesem Beispiel „Adressen“ bezieht sich auf Person.Addresses. Das Problem ist also, dass, wenn Sie etwas schreiben harmlos wie
module M
{
type T
{
Text : Text;
SomethingElse : Text;
}
}
... dann wird der „Text“ in der Art Zuschreibung für somethingelse bezieht sich nicht auf Language.Text, sondern T.Text. Und das ist, was falsch läuft. Die Abhilfe ist es so zu schreiben:
module M
{
type T
{
Text : Text;
SomethingElse : Language.Text;
}
}
(Sie fragen sich vielleicht, warum die Dinge wie. „Text: Text“ Arbeit im Beispiel oben gibt es eine Sonderregel:. Identifikatoren in einer Art Zuschreibung Feld nicht auf das Gebiet beziehen sich die kanonische Beispiel hierfür ist „Adresse: Address“ ).