首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >奥斯陆错误"M0197:‘文本’不能在类型上下文中使用“的解释?

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

Stack Overflow用户
提问于 2008-10-31 14:17:04
回答 2查看 317关注 0票数 0

在Microsoft奥斯陆SDK 2008 (使用Intellipad)中,以下代码编译得很好:

代码语言:javascript
复制
module M {
    type T {
        Text : Text;
    }
}

在编译以下代码时,会导致错误"M0197:'Text‘不能在类型上下文中使用“

代码语言:javascript
复制
module M {
    type T {
        Text : Text;
        Value : Text; // error
    } 
}

我看不到示例之间的区别,因为在第一个案例中,文本也使用在Type上下文中。

更新:

为了增加混乱,请考虑下面的示例,它也编译得很好:

代码语言:javascript
复制
module M {
    type X;
    type T {
      X : X;
      Y : X;
    } 
}

M语言规范规定:

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

A型;B型{A: A;}

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

用户定义的类型和内建的(内部的)类型似乎不一样。

UPDATE2:

请注意,上述示例中的值不是保留关键字。如果将值重命名为Y,则会出现相同的错误。

有什么想法吗?

你好,坦伯格

EN

回答 2

Stack Overflow用户

发布于 2008-10-31 14:41:38

据我所见你已经重新定义了Text

代码语言:javascript
复制
Text : Text

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

代码语言:javascript
复制
Value : Text

这是不允许的。为什么使用类型名称作为属性来重新定义我还不完全清楚的类型(仍在阅读M语言规范),但我确信这是有充分理由的。只需将尚未定义的类型命名为Text (用括号([Text])对其进行转义也不起作用)。

票数 1
EN

Stack Overflow用户

发布于 2009-01-31 19:23:00

问题是:在M中,你可以这样做:

代码语言:javascript
复制
module M
{
  type Address;
  type Person
  {
    Addresses : Address*;
    FavoriteAddress : Address where value in Addresses;
  }  
}

在该示例中,"Addresses“指的是Person.Addresses。那么问题是,当你写一些无害的东西时,比如

代码语言:javascript
复制
module M
{
  type T
  {
    Text : Text;
    SomethingElse : Text;
  }
}

...then SomethingElse类型归属中的“文本”指的不是Language.Text,而是T.Text。这就是问题所在。解决办法是这样写:

代码语言:javascript
复制
module M
{
  type T
  {
    Text : Text;
    SomethingElse : Language.Text;
  }
}

(您可能想知道为什么像"Text : Text“这样的东西在上面的示例中起作用。有一个特殊的规则:字段类型归属中的标识符不能引用字段本身。这方面的典型示例是"Address :Address“)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/253666

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档