Oslo 오류에 대한 설명“M0197 : 'Text'는 유형 컨텍스트에서 사용할 수 없습니다”?
문제
Microsoft Oslo SDK CTP 2008 (Intellipad 사용)에서 다음 코드는 잘 구성됩니다.
module M {
type T {
Text : Text;
}
}
아래 코드를 컴파일하는 동안 "M0197 : 'Text'는 유형 컨텍스트에서 사용할 수 없습니다"오류로 이어집니다.
module M {
type T {
Text : Text;
Value : Text; // error
}
}
첫 번째 사례 텍스트에서도 유형 컨텍스트에서도 사용되는 예제 간의 차이가 보이지 않습니다.
업데이트:
혼란에 추가하려면 다음 예제를 고려하십시오.
module M {
type X;
type T {
X : X;
Y : X;
}
}
M 언어 사양은 다음을 나타냅니다.
필드 선언은 선언 자체에 대한 선언의 유형을 방지하기 위해 어휘 스코핑을 무시합니다. 필드 선언의 유형이 선언 자체가되어서는 안됩니다. 그러나 선언은 제약으로 사용될 수 있습니다. 다음 예를 고려하십시오.
유형 A; 유형 B {a : a; }
필드 선언 a의 유형 표현에 대한 어휘를 둘러싸는 범위는 엔티티 선언 B입니다. 예외적으로, 유형의 유형 A는 오류 인 순환 참조에서 필드 선언에 바인딩됩니다. 예외를 통해 어휘 조회는이 경우 필드 선언을 건너 뛸 수 있습니다.
사용자 정의 유형과 내장 (내장) 유형은 동일하게 처리되지 않은 것 같습니다.
Update2 :
주목하십시오 값 위의 예에서는 예약 된 키워드가 아닙니다. 이름 바꾸면 동일한 오류가 발생합니다 값 에게 와이.
어떤 아이디어?
안부, 탐버그
다른 팁
내가보고있는 것에서 당신이 재정의했습니다 Text
:
Text : Text
그런 다음 가치 유형에 사용하려고합니다.
Value : Text
허용되지 않습니다. 유형 이름을 속성으로 사용하면 전적으로 명확하지 않은 유형을 재정의하는 이유 (여전히 M 언어 사양을 읽고 있음) 그러나 그에 대한 좋은 이유가 있다고 확신합니다. 그냥 이름 Text
아직 정의 된 유형이 아닌 것 (브래킷으로 탈출하는 것)[Text]
)도 작동하지 않습니다).
문제는 다음과 같습니다. 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;
}
}
( "텍스트 : 텍스트"와 같은 것들이 위의 예제에서 작업하는 이유를 궁금해 할 수 있습니다. 특별 규칙이 있습니다. 필드의 유형에 식별자가 필드 자체를 참조 할 수 없습니다. 이에 대한 정식 예는 "주소 : 주소"입니다.)