Fehler : Mögliche Nullverweisrückgabe

  • C#

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Fehler : Mögliche Nullverweisrückgabe

    Hallo zusammen,

    ich versuche gerade folgenden Code von VB nach C# zu übersetzen und bekomme 2 Warnungen die die letzten beiden return Anweisungen betreffen.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Function FindOwnerWindow(viewModel As Object) As Window
    2. If viewModel IsNot Nothing Then
    3. If viewModel.GetType Is GetType(DialogWindow) Then Return CType(viewModel, Window)
    4. If Application.Current.Windows.Cast(Of Window)().SingleOrDefault(Function(x) x.DataContext IsNot Nothing AndAlso x.DataContext.GetType Is viewModel.GetType) Is Nothing Then
    5. For Each window As Window In (From win In Application.Current.Windows()).ToList
    6. If window.DataContext IsNot Nothing AndAlso window.DataContext.GetType Is viewModel.GetType Then
    7. Return window
    8. End If
    9. Next
    10. Else
    11. Return Application.Current.Windows.Cast(Of Window)().SingleOrDefault(Function(x) x.DataContext IsNot Nothing AndAlso x.DataContext.GetType Is viewModel.GetType)
    12. End If
    13. End If
    14. Return Application.Current.Windows.Cast(Of Window)().SingleOrDefault(Function(x) x.IsActive)
    15. End Function


    Das ist was ich übersetzt habe.
    Spoiler anzeigen

    C#-Quellcode

    1. public Window FindOwner(object viewModel)
    2. {
    3. if (viewModel != null)
    4. {
    5. if (viewModel.GetType() == typeof(DialogWindow)) return (Window)viewModel;
    6. if (Application.Current.Windows.Cast<Window>().SingleOrDefault(x => x.DataContext != null && x.DataContext.GetType() == viewModel.GetType()) == null)
    7. {
    8. foreach (Window window in (from Window win in Application.Current.Windows select win).ToList())
    9. {
    10. if (window.DataContext != null && window.DataContext.GetType() == viewModel.GetType())
    11. return window;
    12. }
    13. }
    14. else
    15. {
    16. return Application.Current.Windows.Cast<Window>().SingleOrDefault(x => x.DataContext != null && x.DataContext.GetType() == viewModel.GetType());
    17. }
    18. }
    19. return Application.Current.Windows.Cast<Window>().SingleOrDefault(x => x.IsActive);
    20. }


    Nun kann ich mit der Fehlermeldung nichts anfangen. Habe ich beim Übersetzen Fehler gemacht und den VB Code womöglich falsch verstanden?
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Tatsächlich behebt das den Fehler. Ob das aber korrekt ist und nicht später noch weitere Fehler hervorhebt kann ich noch nicht sagen.
    Lösung vorerst:
    Spoiler anzeigen

    C#-Quellcode

    1. public Window? FindOwner(object viewModel)
    2. {
    3. if (viewModel != null)
    4. {
    5. if (viewModel.GetType() == typeof(DialogWindow)) return (Window)viewModel;
    6. if (Application.Current.Windows.Cast<Window>().SingleOrDefault(x => x.DataContext != null && x.DataContext.GetType() == viewModel.GetType()) == null)
    7. {
    8. foreach (Window window in (from Window win in Application.Current.Windows select win).ToList())
    9. {
    10. if (window.DataContext != null && window.DataContext.GetType() == viewModel.GetType())
    11. return window;
    12. }
    13. }
    14. else
    15. {
    16. return Application.Current.Windows.Cast<Window>().SingleOrDefault(x => x.DataContext != null && x.DataContext.GetType() == viewModel.GetType());
    17. }
    18. }
    19. return Application.Current.Windows.Cast<Window>().SingleOrDefault(x => x.IsActive);
    20. }
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.
    also ich sehe in deim Code etwas, was bei mir die Meldung bringen würde: "Nicht alle CodePfade geben einen Wert zurück".
    Jo, das ist ja tatsächlich ein Problem, und könnte man beheben.
    Und sowieso was hübschen, diese tiefe Verschachtelung und die vielen Bandwurm-Zeilen erzeugen ja einen Hirntumor.
    Wo fehlen denn return-Values? Am Ende greifen doch die Endzeilen, die immer mit einem return beginnen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Ja, hast recht. Wie gesagt: Hirnkrampf wegen Auto-Obfuscation.
    Hier mein Versuch, es aufzuhübschen, ungetestet - bitte gründlich prüfen:

    C#-Quellcode

    1. /// <summary>finde das geöffnete Window mit gegebenen viewModel - ansonsten das Aktive.
    2. /// Wenn das viewModel selbst ein DialogWindow ist, dann aber es selbst</summary>
    3. public Window FindOwner(object viewModel) {
    4. if (viewModel is DialogWindow) return (Window)viewModel;
    5. var appWindows = Application.Current.Windows.Cast<Window>();
    6. if (viewModel == null) return appWindows.SingleOrDefault(x => x.IsActive);
    7. var tpVM = viewModel.GetType();
    8. var owningWndw = appWindows.FirstOrDefault(x => x.DataContext?.GetType() == tpVM);
    9. return owningWndw ?? appWindows.SingleOrDefault(x => x.IsActive);
    10. }
    Doku-Comment auch gern gesehen - da wird auch klar, wie problematisch die Methode eiglich ist.

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

    Ich würde hald den Parameter ViewModel erst auf null prüfen und dann erst versuchen abzufragen um welchen Typ es sich handelt.

    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. ##