![]() |
Typecasting in C#
Hi,
In Delphi geht ja folgendes:
Delphi-Quellcode:
Das geht in C# nicht. Ich habe meine SocketEx-Klasse von Socket abgeleitet und mein Problem ist gerade, dass Socket.Accept() ein Socket zurück gibt und er mir das weder implizit noch explizit konvertieren will.
var x: TObject;
y: TButton; begin x := y; end;
Code:
Das compiliert zwar, wirft aber eine Exception. Weiß jemand wies geht?
SocketEx tmp;
tmp = (SocketEx)server.Accept(); |
Re: Typecasting in C#
Zitat:
Zitat:
In Delphi kannst du alles auf alles casten, weil Delphi zur Laufzeit nicht Typsafe ist. .Net IST typesafe. Du kannst nicht eine Referenz von Socket als SocketEx nutzen, wenn die Referenz nicht auf eine Instanz von SocketEx oder einen Nachfahren zeigt. das hier würde gehen:
Code:
Socket ref1 = new SocketEx();
SocketEx ref2 = (SocketEx)ref1; |
Re: Typecasting in C#
Hi,
Also so sieht meine (noch sehr bescheidene^^) SocketEx Klasse aus:
Code:
Die Methode Accept() von Socket gibt ein Socket zurück. Quasi:
public class SocketEx:Socket
{ public bool isbusy; SocketEx(AddressFamily addr, SocketType socktype,ProtocolType protoc):base(addr,socktype,protoc) { } }
Code:
und folgendes geht nicht:
public Socket Accept()
{ // ka }
Code:
Meldung:
public static SocketEx server = new SocketEx(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
// ... SocketEx tmp; tmp = server.Accept(); Zitat:
|
Re: Typecasting in C#
Hallo,
sowas kann ja nicht gehen. Du hast eine Variable vom Typ einer abgeleiteten Klasse, und willst ihr ein Objekt der Basisklasse zuweisen. Andersrum wird ein Schuh draus. Sowas klappt auch in Delphi nicht. Gruß xaromz |
Re: Typecasting in C#
Ehm Recht hast du.
Aber wie löse ich denn jetzt mein Problem konkret? Das muss doch gehn?! Ich steh grad aufm Schlauch :? |
Re: Typecasting in C#
Zitat:
Code:
SocketEx server = new SocketEx(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
Socket tmp = server.Accept(); |
Re: Typecasting in C#
Zitat:
Das Problem ist einfach, dass das Socket was ich von Accept() zurückbekomme eben nur ein Socket ist und kein SocketEx -.- Also kann ich da noch so viel rumcasten. Wenns kein SocketEx ist, ists kein SocketEx... :| Toll -.- Jetzt bin ich mit meinem (C#-)Latein am Ende :( |
Re: Typecasting in C#
Denkt doch nicht so kompliziert! So einfach geht es:
Code:
Begründung: Accept liefert eine Socket-Instanz. Wenn es sich dabei aufgrund der äußeren Umstände wirklich um eine SocketEx-Instanz handelt, kann es mit as einfach konvertiert werden. Dies hat außerdem den Vorteil, dass die as-Konvertierung im Fehlerfall null zurückliefert, ohne dass es zu einer Exception führt. Dies kann (besser: sollte in der Regel) vor der Fortsetzung geprüft werden.
SocketEx ext = server.Accept() as SocketEx;
if (ext != null) // usw. Das besagte auch die obige Fehlermeldung: Zitat:
Gruß Jürgen |
Re: Typecasting in C#
Beschreibe doch einmal näher, was du mit deiner SocketEx-Klasse vorhast. Wenn es ein Wrapper werden soll, ist Vererbung der falsche Weg.
|
Re: Typecasting in C#
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:57 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz