Explicação do erro de Oslo “M0197: 'texto' não pode ser usado em um contexto de tipo”?
Pergunta
No Microsoft Oslo SDK CTP 2008 (usando Intellipad), o seguinte código compila bem:
module M {
type T {
Text : Text;
}
}
Enquanto a compilação do código abaixo leva ao erro "M0197: 'texto' não pode ser usado em um contexto de tipo"
module M {
type T {
Text : Text;
Value : Text; // error
}
}
Não vejo a diferença entre os exemplos, como no primeiro caso, o texto também é usado em um contexto de tipo.
ATUALIZAR:
Para adicionar à confusão, considere o exemplo a seguir, que também compila bem:
module M {
type X;
type T {
X : X;
Y : X;
}
}
A especificação de idioma M afirma que:
As declarações de campo substituem o escopo lexical para impedir o tipo de ligação de uma declaração à própria declaração. O tipo atribuído de uma declaração de campo não deve ser a própria declaração; No entanto, a declaração pode ser usada em uma restrição. Considere o seguinte exemplo:
tipo A; tipo B {a: a; }
O escopo que inclui lexicamente para a atribuição de tipo da declaração de campo a é a declaração de entidade B. Sem exceção, a atribuição de tipo A se ligaria à declaração de campo em uma referência circular que é um erro. A exceção permite a pesquisa lexical para pular a declaração de campo neste caso.
Parece que tipos definidos pelo usuário e tipos internos (intrínsecos) não são tratados iguais.
Update2:
Observe que Valor No exemplo acima, não é uma palavra -chave reservada. O mesmo erro resulta se você renomear Valor para Y.
Alguma ideia?
Atenciosamente, Tamberg
Outras dicas
Pelo que estou vendo, você redefiniu Text
:
Text : Text
E então você está tentando usá -lo para o tipo de valor:
Value : Text
o que não é permitido. Por que o uso de um nome de tipo como propriedade redefine um tipo que não estou totalmente claro (ainda lendo M Specification Language), mas tenho certeza de que há uma boa razão para isso. Apenas nome Text
Algo que ainda não é um tipo definido (escapando com colchetes ([Text]
) também não funciona).
Aqui está o problema: em M, você pode fazer truques como este:
module M
{
type Address;
type Person
{
Addresses : Address*;
FavoriteAddress : Address where value in Addresses;
}
}
Nesse exemplo, "endereços" refere -se a pessoa. O problema, então, é que quando você escreve algo inócuo como
module M
{
type T
{
Text : Text;
SomethingElse : Text;
}
}
... Então o "texto" na atribuição de tipo para algo que se refere não ao idioma.text, mas para t.Text. E é isso que está dando errado. A solução alternativa é escrever assim:
module M
{
type T
{
Text : Text;
SomethingElse : Language.Text;
}
}
(Você pode se perguntar por que coisas como "texto: texto" funcionam no exemplo acima. Há uma regra especial: identificadores na atribuição de tipo de um campo não podem se referir ao próprio campo. O exemplo canônico para este é "endereço: endereço".)