在Microsoft奥斯陆SDK 2008 (使用Intellipad)中,以下代码编译得很好:
module M {
type T {
Text : Text;
}
}在编译以下代码时,会导致错误"M0197:'Text‘不能在类型上下文中使用“
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:
请注意,上述示例中的值不是保留关键字。如果将值重命名为Y,则会出现相同的错误。
有什么想法吗?
你好,坦伯格
发布于 2008-10-31 14:41:38
据我所见你已经重新定义了Text
Text : Text然后尝试将其用于值的类型:
Value : Text这是不允许的。为什么使用类型名称作为属性来重新定义我还不完全清楚的类型(仍在阅读M语言规范),但我确信这是有充分理由的。只需将尚未定义的类型命名为Text (用括号([Text])对其进行转义也不起作用)。
发布于 2009-01-31 19:23:00
问题是:在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;
}
}...then SomethingElse类型归属中的“文本”指的不是Language.Text,而是T.Text。这就是问题所在。解决办法是这样写:
module M
{
type T
{
Text : Text;
SomethingElse : Language.Text;
}
}(您可能想知道为什么像"Text : Text“这样的东西在上面的示例中起作用。有一个特殊的规则:字段类型归属中的标识符不能引用字段本身。这方面的典型示例是"Address :Address“)。
https://stackoverflow.com/questions/253666
复制相似问题