2008-10-31 7 views
0

2008 (Intellipad 사용) 다음 코드는 잘 컴파일 :오슬로 오류 설명 "M0197 : '텍스트'유형 컨텍스트에서 사용할 수 없습니다?" 마이크로 소프트 오슬로 SDK CTP에서

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

아래의 코드를 컴파일하면 오류 "M0197 : 타입 컨텍스트에서 사용할 수 없습니다 '텍스트'"리드하면서

module M { 
    type T { 
     Text : Text; 
     Value : Text; // error 
    } 
} 

첫 번째 경우와 마찬가지로 텍스트가 유형 컨텍스트에서 사용되는 것과 같이 예제간에 차이점이 표시되지 않습니다.

UPDATE :

필드를 선언 어휘 오버라이드 (override) :

module M { 
    type X; 
    type T { 
     X : X; 
     Y : X; 
    } 
} 

M 언어 사양한다고 :

도 잘 컴파일 다음의 예를 고려 혼란에 추가하려면 범위 선언은 선언 자체에 대한 바인딩 선언의 유형을 방지합니다. 필드 선언의 유형은 선언 자체가 아니어야합니다. 그러나 선언문은 제약 조건에서 사용될 수 있습니다. 다음 예제를 고려하십시오.

유형 A; 유형 B { A : A; }

필드 선언의 형식 ascription에 대한 어휘를 둘러싸는 범위는 엔티티 선언 B입니다. 예외없이 유형 ascription A는 오류 인 순환 참조의 필드 선언에 바인딩됩니다. 이 경우에는 어휘 검색에서 필드 선언을 건너 뛸 수 있습니다.

사용자 정의 유형과 내장 (내장) 유형은 동일하게 취급되지 않는 것 같습니다.

UPDATE2 : 위의 예에서 이 예약 된 키워드 아니라고

참고. 값을에서 Y으로 변경하면 같은 오류가 발생합니다.

아이디어가 있으십니까?

Text : Text 

을 한 다음 값의 유형을 위해 그것을 사용하려고 : 나는 당신이 Text 재정의 한보고있는 무슨에서

답변

1

을 tamberg

감사합니다,

Value : Text 

하는 허용되지 않습니다. 왜 유형 이름을 속성으로 사용하여 형식을 재정의했는지 (아직 M 언어 사양을 읽는 중임) 명확하지는 않지만 좋은 이유가있을 것입니다. Text이라는 이름을 이미 정의 된 유형이 아닌 이름으로 지정하십시오. (대괄호 ([Text])로 이스케이프 처리해도 작동하지 않습니다).

+0

"속성으로 형식 이름을 사용하면 형식을 재정의하는 이유가 무엇입니까?" 정확히 그게 내 질문입니다. 첫 번째 예제의 의미는 두 번째 예제의 오류가 버그가 아닌 경우 이해하기 어렵게됩니다. – tamberg

+0

예, "a ha!"라고 생각합니다.하지만 혼란 스럽습니다. 순간. – cfeduke

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의 형태 귀속에서 "텍스트"하지 Language.Text에 있지만, T.Text을 의미한다는 것이다. 그리고 그것이 잘못된 것입니다. . 위의 예에서 "텍스트 텍스트"작업 특별한 규칙이있다 : 필드의 형태 귀속의 식별자 필드를 참조 할 수 없습니다와 같은 일들이 왜

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

(당신은 궁금 수 있습니다 해결 방법은 다음과 같이 그것을 작성하는 것입니다 이것에 대한 표준 예는 "Address : Address"입니다.