Benutzer mit den meisten Antworten
Rückgabewert einer Methode von generischem Typ

Frage
-
Hallo alle zusammen.
Ich möchte eine Methode in VB.NET erstellen, deren Funktionswert vom Typ generisch ist, also etwa so:
Public Function Cnv(Of T)(nString As String, ByRef rValue As T) As T If rValue.GetType() Is GetType(Integer) Then Return CInt(nString) Else Return Nothing End If End Function
Leider bekomme ich für "CInt(nString)" grundsätzlich den Fehler "Der Wert vom Typ 'Integer' kann nicht in 'T' konvertiert werden." und das egal, ob ich CInt verwende oder CType oder DirecCast oder den Rückgabewert direkt an rValue übergebe.
Logischerweise wird
CType(CObj(nString), T)
anerkannt,
CType(CInt(nString), T)
aber eben nicht, ... vermutlich auch logischerweise ...
Was kann ich noch anstellen, damit der Rückgabewert vom Typ T ist bzw. Integer, Single oder ähnliches?
Danke für Eure Hinweise.
Gruß, Werner
WM
Antworten
-
Hi Werner,
Dein Konzept ist etwas unklar. Die If-Bedingung bedeutet, dass sie nur wahr ist, wenn T auch Integer ist. Allgemein funktioniert:Friend Sub Execute() Dim res1 = Cnv(Of Integer)("5") Console.WriteLine(res1) End Sub Private Function Cnv(Of T)(nString As Object) As T Return CType(nString, T) End Function
Wenn Du auf den Typ testen willst, dann kann man das so machen:
Private Function Cnv(Of T)(nString As Object) As T If GetType(T) Is GetType(Integer) Then Return CType(nString, T) Else Return Nothing End If End Function
Alternativ ist auch mit einer Prüfung der Eingabe-Zeichenkette und Boxing eine Lösung möglich, die in jedem Fall fehlerfrei abgearbeitet wird:
Private Function Cnv3(Of T)(nString As String) As T If GetType(T) Is GetType(Integer) Then Dim intVar As Integer = 0 Integer.TryParse(nString, intVar) Dim intObj As Object = intVar Return CType(intObj, T) Else Return Nothing End If End Function
--
Viele Grüsse
Peter Fleischer (ehem. MVP)
Meine Homepage mit Tipps und Tricks
- Bearbeitet Peter Fleischer Montag, 3. Juli 2017 13:14
- Als Antwort vorgeschlagen Peter Fleischer Montag, 3. Juli 2017 13:14
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Donnerstag, 13. Juli 2017 13:26
Alle Antworten
-
Hi Werner,
Dein Konzept ist etwas unklar. Die If-Bedingung bedeutet, dass sie nur wahr ist, wenn T auch Integer ist. Allgemein funktioniert:Friend Sub Execute() Dim res1 = Cnv(Of Integer)("5") Console.WriteLine(res1) End Sub Private Function Cnv(Of T)(nString As Object) As T Return CType(nString, T) End Function
Wenn Du auf den Typ testen willst, dann kann man das so machen:
Private Function Cnv(Of T)(nString As Object) As T If GetType(T) Is GetType(Integer) Then Return CType(nString, T) Else Return Nothing End If End Function
Alternativ ist auch mit einer Prüfung der Eingabe-Zeichenkette und Boxing eine Lösung möglich, die in jedem Fall fehlerfrei abgearbeitet wird:
Private Function Cnv3(Of T)(nString As String) As T If GetType(T) Is GetType(Integer) Then Dim intVar As Integer = 0 Integer.TryParse(nString, intVar) Dim intObj As Object = intVar Return CType(intObj, T) Else Return Nothing End If End Function
--
Viele Grüsse
Peter Fleischer (ehem. MVP)
Meine Homepage mit Tipps und Tricks
- Bearbeitet Peter Fleischer Montag, 3. Juli 2017 13:14
- Als Antwort vorgeschlagen Peter Fleischer Montag, 3. Juli 2017 13:14
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Donnerstag, 13. Juli 2017 13:26
-
Hallo Peter.
Vielen Dank für Deine schnelle Hilfe. Ich hatte nur Integer angeführt, weil es mir nur um das Problem der Rückgabe ging.
Die ersten beiden Lösungen bringen bei mir nach wie vor den selben Fehler. Vielleicht liegt das aber auch an der VB-/VS-Version. Ich habe hier VS 2013.
Aber der letzte Lösungsvorschlag hat geholfen. Daran hatte ich überhaupt nicht gedacht.
Nochmals vielen Dank.
Gruß, Werner
WM
-
Hi Werner,
wichtig ist, dass CType nur mit Objekten funktioniert. D.h., der formale Parameter sollte vom Typ Object sein. Vermutlich ist Deinem Aufruf eine Inkonsistenz, so dass Fehler auftreten.Eine generische Methode sollte aber möglichst ohne If GetType(T) Is GetType(Integer) ... auskommen. Man sollte dann New T oder Default(T) nutzen und dann weiter arbeiten.
--
Viele Grüsse
Peter Fleischer (ehem. MVP)
Meine Homepage mit Tipps und Tricks