DXE7 : "유형 A = 유형 B"및 var x (유형 A) : = A.create는 E2010 비 호환 유형 컴파일 오류를 발생시킵니다. 왜?

KaiW

A. 문제에 대한 간략한 요약 :

type
  A = class(TObject)
  end;

  B = type A;

E2010 incompatible types: 'B' and 'A'다음 스타일로 클래스 B의 변수를 인스턴스화 할 때 컴파일러 오류 가 표시됩니다.

var
  TheB: B;
begin
     TheB:= B.Create;
     ..

두 번째 "유형"을 제거하여이 문제를 피할 수 있으므로 선언이 표준입니다.

type
  A = class(TObject)
  end;

  B = A;

그러나 제 생각에는 A가 직접 사용되지 않기 때문에 두 번째 "유형"이있는 경우에도 오류가 발생해서는 안됩니다 (두 번째 "유형"은 컴파일러에게 두 클래스를 모두 개별적으로 보도록 지시합니다. http : //docwiki.embarcadero 참조) . com / RADStudio / Seattle / en / Declaring_Types ). 오류가 내 의견을 무시하는 이유 때문에 누군가 설명 할 수 있습니까? (영형;

B. 완전한 역사와 더 복잡한 세부 사항 :

우선 : 오류 :

[dcc32 Fehler] gboDHL.pas(165): E2010 Inkompatible Typen: 'Origin' und 'CountryType' (영어로 "호환되지 않는 유형"을 의미),

다음 코드 줄에서 발생합니다.

AShipmentOrder.Shipment.Shipper.Address.Origin:= DHL_geschaeftskundenversand_api_2.Origin.Create;

이제 배경은 다음과 같습니다.

나는 여전히 SOAP를 사용하여 배송 주문을 생성하는 "새로운"DHL Geschäftskundenversand API v2.2와 통신하려고합니다. DHL_geschaeftskundenversand_api_2해당 서비스를 위해 통합 된 delphi xe7 WSDL 생성기에서 완전히 생성 된 단위입니다. AShipmentOrder요청의 최상위 xml 노드를 나타내는 인스턴스입니다.

"Origin"클래스는 다음과 같이 구현 / 생성됩니다.

type    
  CountryType = class(TRemotable)
  private
    Fcountry: country2;
    Fcountry_Specified: boolean;
    FcountryISOCode: countryISOType;
    Fstate: state;
    Fstate_Specified: boolean;
    Fcountry_: country;
    Fcountry__Specified: boolean;
    FcountryISOCode_: countryISOType;
    Fstate_: state2;
    Fstate__Specified: boolean;
    procedure Setcountry(Index: Integer; const Acountry2: country2);
    function  country_Specified(Index: Integer): boolean;
    procedure Setstate(Index: Integer; const Astate: state);
    function  state_Specified(Index: Integer): boolean;
    procedure Setcountry_(Index: Integer; const Acountry: country);
    function  country__Specified(Index: Integer): boolean;
    procedure Setstate_(Index: Integer; const Astate2: state2);
    function  state__Specified(Index: Integer): boolean;
  published
    property country:         country2        Index (IS_OPTN) read Fcountry write Setcountry stored country_Specified;
    property countryISOCode:  countryISOType  read FcountryISOCode write FcountryISOCode;
    property state:           state           Index (IS_OPTN) read Fstate write Setstate stored state_Specified;
    property country_:        country         Index (IS_OPTN) read Fcountry_ write Setcountry_ stored country__Specified;
    property countryISOCode_: countryISOType  read FcountryISOCode_ write FcountryISOCode_;
    property state_:          state2          Index (IS_OPTN) read Fstate_ write Setstate_ stored state__Specified;
  end;

  Origin          =  type CountryType;      { "http://dhl.de/webservice/cisbase"[GblElm] }

의 "property"Origin은 다음 AShipmentOrder.Shipment.Shipper.Address과 같이 구현 / 생성됩니다.

type
 NativeAddressType = class(TRemotable)
 ...
 published
 ...
   property Origin: Origin  Index (IS_OPTN or IS_REF) read FOrigin write SetOrigin stored Origin_Specified;
 ...
 end;

확실하지 않은 경우 ´AShipmentOrder.Shipment.Shipper.Address´가 등급에 속한다고 말씀 드리겠습니다. NativeAddressType

Windows 10, 64 비트에서 32 비트로 컴파일하는 Delphi XE7을 사용하고 있습니다.

델파이 WSDL 생성기는 이전에 관리해야했던 다른 문제를 가지고 있으며, 출력에서 ​​속성 이름이 클래스 이름과 동일하지만 변경할 수없는 것은 실제로 "좋은"것은 아닙니다. "Origin"클래스는 자신이 속한 속성으로 명명 된 생성 된 단위의 유일한 클래스가 아니지만 이러한 클래스가 다음과 같이 구현 될 때만 오류가 발생합니다.

type
 A = type B

특수 선언 변형에 대한 설명을 찾으려고했지만 키워드가 너무 자주 사용되기 때문에 꽤 어렵습니다.

http://www.delphibasics.co.uk/RTL.asp?Name=Type 나는 다음과 같은 설명을 발견 :

1.type Name = Existing type   Refers to an existing type, such as string by a new Name.   2.type Name = type Existing type   This has the same effect as above, but ensures that at run time, variables of this type are identified by their new type name, rather than the existing type name.

내가 제대로 것을 이해한다면, 그 수단은 내 예제에서 클래스는 것을 Origin이상으로 식별되지 CountryType만,로 Origin. 속성 Origin이 클래스로 선언 되었기 때문에 괜찮을 것입니다 Origin.

이 문제를 이해하려고 노력하는 동안 생성 된 유닛의 클래스 "Origin"을 OriginType으로 수동으로 이름을 변경했습니다 (델파이는 해당 유닛의 여러 다른 클래스와 함께 해당 접미사 "Type"을 사용했습니다. 원산지 유형). 그 후에 이름 충돌을 제외 할 수 있습니다. 왜냐하면 이제 오류는

[dcc32 Fehler] gboDHL.pas(165): E2010 Inkompatible Typen: 'OriginType' und 'CountryType'

그 오류가 발생하기 때문에 이유가없는 것 같습니다.

몇 시간 후 몇 시간 동안 아이디어없이 다음 Embarcadero WIKI 항목을 찾았습니다. http://docwiki.embarcadero.com/RADStudio/Seattle/en/Declaring_Types

그것에 대해 읽고 생각한 후 A = type B, 클래스 B 이외의 다른 방식으로 클래스 A를 처리 할 필요가 없기 때문에 "유형" 이 필요하지 않다는 것을 알았으므로 생성 된 단위에서 수동으로 제거했습니다. , 잘 작동합니다.

또한 "이름 충돌"을 방지하기 위해 생성기의 특수 옵션이 확인되었음을 이해합니다. 이 옵션을 선택하지 않으면이 문제도 해결되어야합니다 (하지만 다른 문제가 발생할 수 있습니다 (o;).

아마도 이것은 누군가가 그런 문제보다 외부에서 더 많은 시간을 보내는 데 도움이 될 것입니다 (o;

모든 속성 유형 "기원"의했다 나중에 "하는 OriginType"의,이 유형으로 만들었 기 때문에하지만 결국, 나는 여기에 문제가 무엇인지 이해하지 못하는 Origin.Create이상에서 OriginType.Create. 따라서 "CountryType"은 "Origin"/ "OriginType"의 클래스 선언을 제외하고는 사용되지 않았습니다. 제 생각에는 이것이 그 문제로 이어지지 않아야한다고 생각합니다.

누군가 그것을 설명 할 수 있습니까?

미리 감사드립니다

카이

LU RD

다음 E2010 Incompatible types: 'Tb' and 'Ta'과 같이 표시됩니다. 이상하게 보일 수 있습니다.

type
  Ta = class
  end;
  Tb = type Ta;
var
  b: Tb;
begin
  b := Tb.Create;  // E2010 Incompatible types: 'Tb' and 'Ta' 
end.

Ta그리고 Tb두 가지 종류가 있습니다.

유형 호환성 에서 나열된 조건 중 어느 것도 두 개의 고유 한 유형이 호환됨을 나타내는 것이 없음을 알 수 있습니다.

유형 호환성

모든 유형은 그 자체와 호환됩니다. 다음 조건 중 하나 이상을 충족하는 경우 두 가지 구별 유형이 호환됩니다.

  • 둘 다 실제 유형입니다.
  • 둘 다 정수 유형입니다.
  • 한 유형은 다른 유형의 하위 범위입니다.
  • 두 유형 모두 동일한 유형의 하위 범위입니다.
  • 둘 다 호환 가능한 기본 유형이있는 세트 유형입니다.
  • 둘 다 동일한 수의 문자를 가진 패킹 된 문자열 유형입니다.
  • 하나는 문자열 유형이고 다른 하나는 문자열, 압축 문자열 또는 Char 유형입니다.
  • 한 유형은 Variant이고 다른 유형은 정수, 실수, 문자열, 문자 또는 부울 유형입니다.
  • 둘 다 클래스, 클래스 참조 또는 인터페이스 유형이며 한 유형은 다른 유형에서 파생됩니다.
  • 한 유형은 PAnsiChar 또는 PWideChar이고 다른 유형은 PAnsiChar 또는 PWideChar의 array [0..n] 형식의 0부터 시작하는 문자 배열입니다.
  • 한 유형은 포인터 (유형이 지정되지 않은 포인터)이고 다른 유형은 모든 포인터 유형입니다.
  • 두 유형 모두 동일한 유형에 대한 (유형이 지정된) 포인터이며 {$ T +} 컴파일러 지시문이 적용됩니다.
  • 둘 다 동일한 결과 유형, 동일한 수의 매개 변수 및 해당 위치에있는 매개 변수 간의 유형 ID를 갖는 절차 유형입니다.

컴파일러 오류의 원인은 따라서이다 : 당신이 호출 할 때 Tb.Create, 컴파일러 식별 그와 Ta.Create이후와 b별개의 호환되지 않는 타입이다, 그것은 허용되지 않습니다.

이를 결함이라고 부를 수 있지만 엄격한 유형 규칙을 따르며 아래와 같이 쉽게 수정할 수 있습니다.


선언 Tb = class(Ta)하면 Tb에서 파생 된 컴파일러 오류가 해결 됩니다 Ta.


또한 선언 Tb = Ta하면 컴파일러 오류가 해결됩니다. 동일한 유형 (두 개의 다른 유형이 아님)을 나타내므로 할당이 호환되기 때문입니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관