C# -> VB Übersetzung

  • C#

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von NoIde.

    C# -> VB Übersetzung

    Hey,

    ich habe diesen C# Code welchen in VB.net realisieren möchte.

    C#-Quellcode

    1. TVPlayer activePlayer = TVForm.GetInstance().GetActivePlayer();
    2. if (activePlayer != null && activePlayer is LivePlayer)
    3. {
    4. ((LivePlayer) activePlayer).Reload();
    5. }


    So zu übersetzen ist ja einfach, allerdings ist die Übersetzung fehlerbehaftet.

    VB.NET-Quellcode

    1. Dim activePlayer As TVPlayer = TVForm.GetInstance().GetActivePlayer()
    2. If activePlayer Is Nothing AndAlso TypeOf activePlayer Is LivePlayer Then
    3. CType(activePlayer, LivePlayer).Reload()
    4. End If

    Zeile 2: Fehler 1 Ein Ausdruck vom Typ "XYZ.TVPlayer" kann nie vom Typ "XYZ.LivePlayer" sein.
    Zeile 3: Fehler 2 Der Wert vom Typ "XYZ.TVPlayer" kann nicht in "XYZ.LivePlayer" konvertiert werden.

    Was wäre hier eine vernünftige Weise das zu lösen?
    Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
    „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
    Benjamin Franklin
    Hallo

    So?

    VB.NET-Quellcode

    1. If activePlayer IsNot Nothing AndAlso activePlayer.GetType() Is GetType(LivePlayer) Then
    2. CType(activePlayer, LivePlayer).Reload()
    3. End If


    Natürlich nicht getestet.
    ACHTUNG: Natürlich muss activePlayer auf Not Nothing getestet werden oder?

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Types können im Normallfall gleich auf Gleichheit geprüft werden, und der Cast mit einer DirectCast

    VB.NET-Quellcode

    1. If activePlayer IsNot Nothing AndAlso activePlayer.GetType = GetType(LivePlayer) Then
    2. DirectCast(activePlayer, LivePlayer).Reload()
    3. End If


    Freundiche Grüsse

    exc-jdbi
    Ups, ja muss auf "Not Nothing" getest werden.
    Fehler 1 ist damit behoben, der 2. bleibt bestehen.

    Warum sind C# und VB so ähnlich und doch so extrem unterschiedlich? Ich überlege nun ob ich nicht doch mal auf C# umsteige, immer solche Hindernisse/Ärgernisse mit VB.

    Obwohl Fehler 1 behoben ist, ist er ja irgendwie noch da, da ich LivePlayer nicht als TVPlayer casten/konvertieren kann.
    Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
    „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
    Benjamin Franklin
    @Nolde

    Das ist nur am Anfang so. Sobald man das Gefühl für beide Syntax hat, weiss man immer sofort wie es ungefähr aussehen muss, und dann ist es nur noch ein kurzes ausprobieren.

    Vielleicht noch eine Frage ist LivePlayer eine Implementierung oder eine Erbung von TVPlayer? Das könnte der Grund sein, dass es nicht klappt im IF-Block. Wahrschein lich muss LivePlayer zuerst auf TVPlayer gecastet werden, und somit nur auf Nothing geprüft werden.


    Freundliche Grüsse

    exc-jdbi

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „exc-jdbi“ ()

    Die Syntax ist weniger das Problem, komme auch gut mit C++ zurecht. Hier ist einfach das Problem, das VB hier nicht mitspielt beim casten/konvertieren zu einem anderem Typ. In C# klappt das ja wunderbar.
    Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
    „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
    Benjamin Franklin

    NoIde schrieb:

    Hier ist einfach das Problem, das VB nicht mitspielt beim casten/konvertieren zu einem anderem Typ.

    Kannst du das genauer ausführen? Warum denn nicht?

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Der Wert vom Typ "XYZ.TVPlayer" kann nicht in "XYZ.LivePlayer" konvertiert werden.

    Die "rückwärts erstellte" C# Projektmappe von einer .net Anwendung(dekompiliert), kompiliert und das Programm funktioniert einwandfrei. Die rüchwärts erstellte VB-Mappe hatte xTausend fehler, daher hatte ich das C# Projekt zum laufen gebracht(waren nur ~200 Fehler) und wolle es dann in VB.net übersetzen.

    Das Original Programm ist ein wenig buggy und hat wenige Features, daher mache ich mir für eine rein private Nutzung eine "Art von Fork" dieses Programms und verbessere es.
    Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
    „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
    Benjamin Franklin
    Hallo

    Wir kennen ja den originalen Source nicht. Anscheinend kann TVPlayer aben nicht in LivePlayer gecastet werden. Evtl. hast du hier bereits einen kleinen Fehler in der Übersetzung (in der LivePlayer oder TVplayer Klasse).
    Hierfür würden wir mehr Infos über den Source benötigen. Aber meines Wissens nach ist es so das es hier keine Unterschiede beim Casten gibt zwischen den Sprachen.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    @NoIde Mach ne C#-Exe und sieh Dir im IlSpy an, wie das da übersetzt wird, das ist besser als ein Übersetzer.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Wärst du bereit mal in die C# Mappe zu schauen? Müsste ich dir via PN einen Link zukommen lassen, hier öffentlich ist weniger gut, da ein dekompilat.
    Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
    „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
    Benjamin Franklin
    @NoIde Kein Problem.
    Möglicherweise geht das hier nicht mit dem Code selbst, weil ich hier keinen Mediaplayer habe.
    Pack die Exe in eine Zip.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Die Anwedung testen kann man auch nur wenn das entsprechende Programm auch installiert ist, sind so einige komponenten.
    Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
    „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
    Benjamin Franklin

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „NoIde“ ()

    @NoIde Da Dein Problem rein syntaktischer Natur ist, genügt einfach die Exe.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Upload ist gemacht(PN), hab dir mal die original exe und den C#-Klon ins Archiv getan. Wie gesagt läuft das Programm nicht ohne alle komponenten des Programms. Es wird wieder beendet. Der Fork funktioniert einwandfrei. Kann mir also weniger vorstellen das ich im C# Projekt etwas falsch gemacht hab.

    Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
    „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
    Benjamin Franklin
    das ist schon in c# schlecht gecodet, in vb wirds dann auch nicht besser.
    Offsichtlich ist dem Programmierer das c# - as - Schlüsselwort nicht bekannt, und in vb.net dessen Entsprechung TryCast. Muss also so:

    VB.NET-Quellcode

    1. Dim activePlayer = TVForm.GetInstance().GetActivePlayer()
    2. dim lPlayer = TryCast(activePlayer, LifePlayer)
    3. If lPlayer isnot Nothing then lPlayer.Reload

    oder kurznKnapp:

    VB.NET-Quellcode

    1. dim lPlayer = TryCast(TVForm.GetInstance().GetActivePlayer(), LifePlayer)
    2. If lPlayer isnot Nothing then lPlayer.Reload

    Also ich hatte auch Stellen im Source wo ich mich fragte was ist das denn jetzt für'n Kram. Kann mir aber auch vorstellen, das durch das dekompileren fragwürdiger Code entstanden ist. Bei einem Select Case(Typ String) hat der Compiler auch ein Zeug mit DisplayClass erzeugt, ein Dictionary(String, Integer) angelegt(die einzelnen String der cases), so das die case's durch Zahlen ersetz wurden. Mit WeissIchGradNichtMehr....TryGetValue wurde dann mit dem Dictionary.Key die Value gehohlt für die Select Case verwzeigung.

    War dann auch so'n Zeug wie TVForm.<>DisplayClass.display_type im wiederhergestellten Source drin. Das war ein Kampf herauszufinden was es damit auf sich hat.

    Sogar goto's sind drin, z.B.~ goto IL_5466:


    Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
    „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
    Benjamin Franklin

    Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „NoIde“ ()