none
Rückgabewert einer Methode von generischem Typ RRS feed

  • 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

    Montag, 3. Juli 2017 10:37

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



    Montag, 3. Juli 2017 12:52

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



    Montag, 3. Juli 2017 12:52
  • 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

    Montag, 3. Juli 2017 13:52
  • 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

    Montag, 3. Juli 2017 14:12