Объяснение ошибки Осло "M0197:" Текст "нельзя использовать в контексте типа"?
В Microsoft Oslo SDK CTP 2008 (с использованием Intellipad) следующий код компилируется нормально:
module M {
type T {
Text : Text;
}
}
в то время как компиляция приведенного ниже кода приводит к ошибке "M0197:" Текст "не может использоваться в контексте типа"
module M {
type T {
Text : Text;
Value : Text; // error
}
}
Я не вижу разницы между примерами, так как в первом случае текст также используется в контексте типа.
ОБНОВИТЬ:
Чтобы добавить к путанице, рассмотрим следующий пример, который также хорошо компилируется:
module M {
type X;
type T {
X : X;
Y : X;
}
}
Спецификация языка M гласит, что:
Объявления полей переопределяют лексическую область видимости, чтобы предотвратить привязку типа объявления к самой декларации. Приписываемый тип объявления поля не должен быть самим объявлением; однако объявление может использоваться в ограничении. Рассмотрим следующий пример:
наберите "А; тип B { A: A; }
Лексически заключенная область видимости для описания типа в объявлении поля A - это объявление объекта B. Без исключения, типовое обозначение A будет связываться с объявлением поля в циклической ссылке, что является ошибкой. Исключение позволяет лексическому поиску пропустить объявление поля в этом случае.
Кажется, что пользовательские типы и встроенные (встроенные) типы не рассматриваются как равные.
UPDATE2:
Обратите внимание, что значение в приведенном выше примере не является зарезервированным ключевым словом. Та же ошибка возникает, если вы переименуете значение в Y.
Есть идеи?
С уважением, Тамберг
3 ответа
Вот проблема: в 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", работают в приведенном выше примере. Существует специальное правило: идентификаторы в надписи типа поля не могут ссылаться на само поле. Каноническим примером этого является "Address: Address".)
Из того, что я вижу, вы переопределили Text
:
Text : Text
а затем вы пытаетесь использовать его для типа значения:
Value : Text
что не разрешено. Почему использование имени типа в качестве свойства переопределяет тип, который мне не совсем понятен (я все еще читаю спецификацию языка M), но я уверен, что для этого есть веская причина. Просто имя Text
что-то, что еще не является определенным типом (экранирование с помощью скобок ([Text]
) тоже не работает).