Einzelnen Beitrag anzeigen

Rollo62

Registriert seit: 15. Mär 2007
3.916 Beiträge
 
Delphi 12 Athens
 
#5

AW: Kann operator "as T" fehlschlagen, wenn operator "is T" OK war ?

  Alt 28. Jul 2022, 14:10
Das ist gut, danke für die Bestätigungen.

@mkinzler
Das "as" auch "is" macht war mir so im Detail nicht bewusst, aber es macht ja für mich keinen Unterschied wenn ich eine Exception im Vorfeld verhindern möchte.

Der eigentliche Übeltäter ist wohl ErrorAt():
Delphi-Quellcode:
  if (Child <> nil) and not (Child is Parent) then
    ErrorAt(Byte(reInvalidCast), ReturnAddress);
Ich wollte mir da was Generisches bauen, so in der Art, und frage mich immer noch ob es den ganzen Aufwand wert ist:

Delphi-Quellcode:

type // Safe type cast from TObject to a derived class, if available, w/o crash
    TMyCast<T : class> = class sealed
        class function CanCast( Sender : TObject ) : Boolean;
        class function TryCast( Sender : TObject; var ACasted : T ) : Boolean;
    end;

...

{ TMyCast<T> }

class function TMyCast<T>.CanCast( Sender : TObject ) : Boolean;
begin
    Result := False;

    if not Assigned( Sender ) then
    begin
        Exit; //<== GUARD ======================================================
    end;

    if not ( Sender is T ) then
    begin
        Exit; //<== GUARD ======================================================
    end;

    Result := True;
end;


class function TMyCast<T>.TryCast( Sender : TObject; var ACasted : T ) : Boolean;
begin
    ACasted := nil;
    Result := False;

    if not Assigned( Sender ) then
    begin
        Exit; //<== GUARD ======================================================
    end;

    if not ( Sender is T ) then
    begin
        Exit; //<== GUARD ======================================================
    end;

    ACasted := Sender as T;
    Result := True;
end;
  Mit Zitat antworten Zitat