奥斯陆错误的解释“ M0197:'文本'不能在类型上下文中使用”?

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

  •  05-07-2019
  •  | 
  •  

在Microsoft Oslo SDK CTP 2008(使用Intellipad)中,以下代码编译良好:

module M {
    type T {
        Text : Text;
    }
}

编译以下代码时会导致错误“M0197:'Text'不能在Type上下文中使用”

module M {
    type T {
        Text : Text;
        Value : Text; // error
    } 
}

我没有看到示例之间的区别,因为在第一种情况下Text也用在Type上下文中。

更新:

为了增加混淆,请考虑以下示例,该示例也编译良好:

module M {
    type X;
    type T {
      X : X;
      Y : X;
    } 
}

M语言规范声明:

  

字段声明覆盖词法作用域,以防止声明的类型绑定到声明本身。字段声明的归属类型不能是声明本身;但是,声明可以用在约束中。请考虑以下示例:

     

A型;   B型{       答:A;   }

     

字段声明A的类型归属的词汇封闭范围是实体声明B.没有例外,类型ascription A将绑定到循环引用中的字段声明,这是一个错误。在这种情况下,异常允许词法查找跳过字段声明。

似乎用户定义的类型和内置(内在)类型不一致。

UPDATE2:

请注意,上例中的 Value 不是保留关键字。如果将重命名为 Y ,则会产生相同的错误。

有什么想法吗?

问候,tamberg

其他提示

从我所看到的你重新定义了 Text

Text : Text

然后您尝试将其用于值类型:

Value : Text

是不允许的。为什么使用类型名称作为属性重新定义了一种我并不完全清楚的类型(仍在阅读M语言规范),但我确信这是一个很好的理由。只需将 Text 命名为尚未定义的类型(用括号转义它( [Text] )也不起作用。)

问题在于:在M中,你可以做这样的技巧:

module M
{
  type Address;
  type Person
  {
    Addresses : Address*;
    FavoriteAddress : Address where value in 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”这样的东西在上面的例子里工作。有一个特殊的规则:字段类型中的标识符不能引用字段本身。这个规范的例子是“地址:地址]按钮。)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top