0

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

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

在编译以下代码时会导致错误“M0197:'Text' cannot be used in a Type context”

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; }

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

似乎用户定义的类型和内置(内在)类型不被平等对待。

更新2:

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

有任何想法吗?

问候,坦伯格

4

3 回答 3

1

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

Text : Text

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

Value : Text

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

于 2008-10-31T14:41:38.590 回答
1

这就是问题所在:在 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的类型描述中的“Text”不是指Language.Text,而是指T.Text。这就是问题所在。解决方法是这样写:

module M
{
  type T
  {
    Text : Text;
    SomethingElse : Language.Text;
  }
}

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

于 2009-01-31T19:23:00.763 回答