Объяснение ошибки Осло “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 привязывалось бы к объявлению поля в циклической ссылке, что является ошибкой.Исключение позволяет лексическому поиску пропустить объявление поля в этом случае.
Похоже, что пользовательские типы и встроенные (встроенные) типы не рассматриваются как равные.
ОБНОВЛЕНИЕ 2:
Обратите внимание , что Значение в приведенном выше примере это не зарезервированное ключевое слово.Та же ошибка возникает при переименовании Значение Для Y.
Есть какие-нибудь идеи?
С уважением, Тамберг
Другие советы
Из того, что я вижу, вы переопределили Text
:
Text : Text
и затем вы пытаетесь использовать его для типа значения:
Value : Text
что недопустимо.Почему использование имени типа в качестве свойства переопределяет тип, мне не совсем понятно (все еще читаю спецификацию языка M), но я уверен, что для этого есть веская причина.Просто назови Text
что-то, что еще не является определенным типом (экранируя его скобками ([Text]
) тоже не работает).
Вот в чем проблема:в M вы можете выполнять подобные трюки следующим образом:
module M
{
type Address;
type Person
{
Addresses : Address*;
FavoriteAddress : Address where value in Addresses;
}
}
В этом примере "Адреса" относятся к лицу.Адреса.Таким образом, проблема в том, что когда вы пишете что-то безобидное, например
module M
{
type T
{
Text : Text;
SomethingElse : Text;
}
}
...тогда "Текст" в описании типа для SomethingElse относится не к языку.Text, а к T.Text.И это то, что идет не так.Обходной путь заключается в том, чтобы написать это следующим образом:
module M
{
type T
{
Text : Text;
SomethingElse : Language.Text;
}
}
(Вы можете задаться вопросом, почему такие вещи, как "Текст :Текст " работайте в приведенном выше примере.Есть особое правило:идентификаторы в описании типа поля не могут ссылаться на само поле.Каноническим примером для этого является "Адрес :Адрес".)