[fpc-pascal] private type and type compatibility

Michael Van Canneyt michael at freepascal.org
Wed Oct 30 10:36:46 CET 2013



On Wed, 30 Oct 2013, Sven Barth wrote:

> Am 30.10.2013 08:47, schrieb Xiangrong Fang:
>       Hi All,
>
>       I have the following class:
>
>       type
>         generic TVector<T> = class
>         private type
>           TDataType = array of T;
>         private
>           FData: TDataType;
>           ... ...
>         public
>           ... ...
>           function Slice(APos: Integer = -1; ACount: Integer = -1): TDataType;
>         end;
> 
> The Slice() method return a portion of the data as a dynamic array.
> 
> My question is, as I define TDataType as PRIVATE type, why it is still usable outside of the class?  In the main program
> I did:
> 
> type
>   TIntVector = specialize TVector<Integer>;
> var
>   iv: TIntVector;
>   ia: array of Integer;
> begin
>   iv := TIntVector.Create;
>   ... ...
>   ia := iv.Slice;
> end.
> 
> This will assign a TDataType (is it TVector$TDataType or TIntVector$TDataType? I don't know) to an "array of Integer".
> Why this assignment works? 
> 
> i.e. how does the type system work?!
> 
> It's a bit annoying that the usage private/protected types in public/published functions is allowed... (this is however Delphi
> compatible) Maybe this should be adjusted for non-Delphi modes for language consistency... (maybe at least as a warning which
> could be elevated to an error if someone wants)

I think it is an error. 
You declare something as private, and then you use it in a public function ? 
If that is not a visibility clash, I don't know what is :)

Michael.


More information about the fpc-pascal mailing list