none
Versuch, aus einer Methode 2 generische listen zurück zu geben ist fehlerhaft - C# RRS feed

  • Frage

  • Hallo Leute,

    folgender Code soll eigentlich nur mehr als eine generische Liste zurück geben. Doch der Code ist bereits vor der Laufzeit fehlerhaft. Wie geht's richtig, ohne eine eigene Klasse schreiben zu müssen? out will ich auch nicht unbedingt verwenden...

            private IList<int> CreatePositionList(int x, int y, int posKingX, int posKingY, List<int> posX, List<int> posY, Piece piece) {
                //Tue was mit den Übergabelisten...
                List<int> listX = posX;
                List<int> listY = posY;
                //..und gebe sie an die aufrufende Instanz zurück
                return new List<int>() { listX, listY };
            }

     
    • Bearbeitet tklustig Mittwoch, 28. August 2019 22:22
    Mittwoch, 28. August 2019 22:20

Antworten

  • Hi,

    das kann nicht gehen.

    Deine Methode ist so definiert, dass Du List<int> zurückgibst, daher kannst Du nicht zwei Listen zurückgeben.

    Wenn Du mehrere List<int> zurückgeben willst, definiere den Rückgabewert entsprechend, bspw. als:

    List<List<int>>

    Also bspw so:

    private List<List<int>> CreatePositionList( ... )
    {
        List<int> list1 = new List<int>() { 1, 2, 3 };
        List<int> list2 = new List<int>() { 4, 5, 6 };
    
        List<List<int>> result = new List<List<int>>() { list1, list2 };           
    
        return result;
    }


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport


    Mittwoch, 28. August 2019 23:44
    Moderator
  • Hallo,

    du könntest ein Array vom Type List<int> zurückgeben.

    private List<int>[] GetList(List<int> l1, List<int> l2)
    {
        return new List<int>[] { l1, l2 };
    }

    Du musst aber die Listen nicht zurückgeben. Hier mal ein einfaches Beispiel:

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
    
            List<int> listMin = new List<int>();
            List<int> listMax = new List<int>();
    
            AddMinMaxToList(2, 5, listMin, listMax);
    
            var la = 123;
        }
    
        private static void AddMinMaxToList(int a, int b, List<int> listMin, List<int> listMax)
        {
            var min = Math.Min(a, b);
            var max = Math.Max(a, b);
    
            listMin.Add(min);
            listMax.Add(max);
        }
    }

    Übergibt man eine Klasse an eine andere Methode erhält man eine Referenz auf die Klasse. Die Klasse selbst existiert nur einmal. Anders ist es bei einem struct (int, float, double). Bei Übergabe an eine Methode wird eine Kopie der struct übergeben nicht die struct selbst. Hier könnte man mit ref arbeiten um das selbe zu erreichen 


    Gruß Thomas
    13 Millionen Schweine landen jährlich im Müll
    Dev Apps von mir: UWP Segoe MDL2 Assets, UI Strings


    Mittwoch, 28. August 2019 23:46

Alle Antworten

  • Habe das vorerst so gelöst, wundere mich aber immer noch, warum obiger Versuch nicht funktioniert...

            private Tuple<List<int>, List<int>> CreatePositionList(int x, int y, int posKingX, int posKingY, List<int> posX, List<int> posY, Piece piece) {
                //Tue was mit den Übergabelisten...
                posX.Add(1);
                posY.Add(2);
                //..und gebe sie an die aufrufende Instanz zurück
                return Tuple.Create(posX, posY);
            }

    Mittwoch, 28. August 2019 22:28
  • Hi,

    das kann nicht gehen.

    Deine Methode ist so definiert, dass Du List<int> zurückgibst, daher kannst Du nicht zwei Listen zurückgeben.

    Wenn Du mehrere List<int> zurückgeben willst, definiere den Rückgabewert entsprechend, bspw. als:

    List<List<int>>

    Also bspw so:

    private List<List<int>> CreatePositionList( ... )
    {
        List<int> list1 = new List<int>() { 1, 2, 3 };
        List<int> list2 = new List<int>() { 4, 5, 6 };
    
        List<List<int>> result = new List<List<int>>() { list1, list2 };           
    
        return result;
    }


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport


    Mittwoch, 28. August 2019 23:44
    Moderator
  • Hallo,

    du könntest ein Array vom Type List<int> zurückgeben.

    private List<int>[] GetList(List<int> l1, List<int> l2)
    {
        return new List<int>[] { l1, l2 };
    }

    Du musst aber die Listen nicht zurückgeben. Hier mal ein einfaches Beispiel:

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
    
            List<int> listMin = new List<int>();
            List<int> listMax = new List<int>();
    
            AddMinMaxToList(2, 5, listMin, listMax);
    
            var la = 123;
        }
    
        private static void AddMinMaxToList(int a, int b, List<int> listMin, List<int> listMax)
        {
            var min = Math.Min(a, b);
            var max = Math.Max(a, b);
    
            listMin.Add(min);
            listMax.Add(max);
        }
    }

    Übergibt man eine Klasse an eine andere Methode erhält man eine Referenz auf die Klasse. Die Klasse selbst existiert nur einmal. Anders ist es bei einem struct (int, float, double). Bei Übergabe an eine Methode wird eine Kopie der struct übergeben nicht die struct selbst. Hier könnte man mit ref arbeiten um das selbe zu erreichen 


    Gruß Thomas
    13 Millionen Schweine landen jährlich im Müll
    Dev Apps von mir: UWP Segoe MDL2 Assets, UI Strings


    Mittwoch, 28. August 2019 23:46
  • Wenn eine Methode mehrere Variablen zurück geben soll, dann können diese, in der Parameterliste, mit dem entsprechenden Schlüsselwort definiert werden. Für Parameter einer Methode gibt es folgende Schlüsselwörter:

    • params - Übergabe einer Variablen Anzahl an Parametern
    • in - Übergabe als Verweis (reference), mit Garantie das nicht in die Variable geschrieben wird
    • ref - Übergabe als Verweis, die Variable kann gelesen oder beschrieben werden
    • out - Übergabe als Verweis und wird von der Methode beschrieben

    Bei Übergabe ohne eines der Schlüsselwörter handelt es sich um eine Wertkopie - gerade auch bei größeren Listen relevant in Bezug auf Speichernutzung und Laufzeit.

    Wenn deine Listen also nur zurückgegeben werden sollen, so wäre das Schlüsselwort out, die geeignet Wahl, um den Nutzer zu zeigen das die Methode diese Variablen beschreibt.

    Weiteres in der Doku: Methodenparameter (C#-Referenz)


    - Gruß Florian

    Donnerstag, 29. August 2019 07:28
  • Hallo Florian,

    eine Klasse wir niemals als Wertekopie übergeben sondern als Referenz. Eine Klasse ist ein Referenztyp. Durch Erzeugung einer Klasse mit new wird sie einmalig im Heap angelegt. Zugriffe erfolgen nur noch über die Referenz. 

    Die Benutzung von in, ref, out bei Klassen ist unnötig dies spart auch keinen Speicher ein. 


    Gruß Thomas
    13 Millionen Schweine landen jährlich im Müll
    Dev Apps von mir: UWP Segoe MDL2 Assets, UI Strings

    Donnerstag, 29. August 2019 11:56
  • eine Klasse wir niemals als Wertekopie übergeben sondern als Referenz. Eine Klasse ist ein Referenztyp. Durch Erzeugung einer Klasse mit new wird sie einmalig im Heap angelegt. Zugriffe erfolgen nur noch über die Referenz. 

    Die Benutzung von in, ref, out bei Klassen ist unnötig dies spart auch keinen Speicher ein. 

    Und? Habe ich irgendetwas über Klassen als Parameter geschrieben, ich weiß von nix. War das Frage in diesem Thread?

    Kannst Du bitte darlegen was eine Klasse ist und erläutern warum es keine Wertkopie einer Klasse geben kann?

    Vielleicht lerne ich dabei noch was ;)


    - Gruß Florian

    Donnerstag, 29. August 2019 14:15
  • Hallo Florian,

    ich nehme mal an, Thomas bezieht sich hierauf:

    Bei Übergabe ohne eines der Schlüsselwörter handelt es sich um eine Wertkopie - gerade auch bei größeren Listen relevant in Bezug auf Speichernutzung und Laufzeit.

    das ist in dieser allgemeinen Form falsch. Instanzen von Klassen (dabei spielt es keine Rolle, ob das bspw. System.IO.File, List<int>, Uri, whateverelse, ... ist) werden generell als Verweis übergeben. Änderungen an dem Parameter innerhalb der Methode ändern daher auch immer das übergebene Objekt (weil es eben nur ein Verweis und keine Kopie ist)

    private void MachWas()
    {
        // Erstelle Liste mit 3 Elementen (1, 2, 3)
        List<int> list1 = new List<int>() { 1, 2, 3 };
        
        // Nach diesem Aufruf hat list1 4 Elemente (123, 2, 3, 999)
        this.ChangeList( list1 );
    }
    
    private void ChangeList( List<int> list )
    {
        list[0] = 123;
        list.Add( 999 );
    }


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Donnerstag, 29. August 2019 14:53
    Moderator
  • Hi Florian,
    Deine Darstellungen können mißverstanden werden, insbesondere im Bezug auf die Codeschnipsel, die Thomas (tklustig) gepostet hatte, siehe Deinen Beitrag:

    Bei Übergabe ohne eines der Schlüsselwörter handelt es sich um eine Wertkopie - gerade auch bei größeren Listen relevant in Bezug auf Speichernutzung und Laufzeit.


    --
    Best Regards / Viele Grüße
    Peter Fleischer (former MVP for Developer Technologies)
    Homepage, Tipps, Tricks

    Donnerstag, 29. August 2019 14:58
  • Bei Übergabe ohne eines der Schlüsselwörter handelt es sich um eine Wertkopie - gerade auch bei größeren Listen relevant in Bezug auf Speichernutzung und Laufzeit.

    das ist in dieser allgemeinen Form falsch.

    Da die zitierte Dokumentation dies so allgemein behauptet, kann ich nicht was anderes behaupten - auch wenn dies hier zutrifft. Die entsprechende Stelle, die anderes darlegt, habe ich leider nicht gefunden. Wenn ich entsprechendes garantieren will, komme ich demnach nicht an der Verwendung der Schlüsselworte vorbei.

    Ansonsten, danke für die Feststellung das es sich um Instanzen von Klassen handelt und nicht um Klassen.


    - Gruß Florian

    Donnerstag, 29. August 2019 15:06
  • Du beziehst dich auf die Listen und eine List in C# ist nun mal eine Klasse. Zudem schlägst Du vor das Schlüsselwort out vor die Liste zu stellen was nur sinn machen würde wenn die Liste noch nicht erzeugt ist.

    class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine("Hello World!");
    
                List<int> listMin;
                List<int> listMax;
    
                AddToList1(2, 5, out listMin, out listMax);
                AddMinMaxToList(2, 5, listMin, listMax);
    
                var la = 123;
            }
    
            private static void AddToList1(int a, int b, out List<int> listMin, out List<int> listMax)
            {
                //listMin und listMax ist noch nicht erzeugt und muss erzeugt werden
                listMin = new List<int>();
                listMax = new List<int>();
    
                var min = Math.Min(a, b);
                var max = Math.Max(a, b);
    
                listMin.Add(min);
                listMax.Add(max);
            }
    
            private static void AddMinMaxToList(int a, int b, List<int> listMin, List<int> listMax)
            {
                var min = Math.Min(a, b);
                var max = Math.Max(a, b);
    
                listMin.Add(min);
                listMax.Add(max);
            }
        }

    Es ist eben nicht die geeignet Wahl eine List (Klasse) mit out zurück zu geben. Ich verstehe deine Antwort so als wäre dies die gängige Praxis. Dem ist aber nicht so. Man musst dem User auch nicht darauf hinweisen das eine Klasse vielleicht in der Methode geändert wird. 


    Gruß Thomas
    13 Millionen Schweine landen jährlich im Müll
    Dev Apps von mir: UWP Segoe MDL2 Assets, UI Strings

    Donnerstag, 29. August 2019 15:21
  • Du beziehst dich auf die Listen und eine List in C# ist nun mal eine Klasse. Zudem schlägst Du vor das Schlüsselwort out vor die Liste zu stellen was nur sinn machen würde wenn die Liste noch nicht erzeugt ist.

    Ich hätte mich gefreut, wenn Du meine Fragen beantwortet hättest.

    Stefan hat es schon ganz richtig erklärt, dass es sich um Objekte (Instanzen von Klassen) handelt.

    Warum funktioniert dein Beispiel:

    Weil es in C# grundsätzlich so ist, dass Variablen von Objekten als Wert Referenzen auf eben diese Objekte im Speicher halten. Nur und nur darum, kann man auf die Nutzung des Schlüsselwortes ref bei der Verwendung von Objekten verzichten. Bei der Liste im genannten Beispiel handelt es sich um ein solches Objekt. Ich hätte in meiner Auslegung wohl deutlich schreiben sollen, dass es mir darum ging, sicherzustellen, dass es sich um eine Referenz handelt, die man dort übergibt (um Missverständnisse zu vermeiden). Im Falle der List, ist es eben eine Wertkopie der Referenz auf das Objekt vom Typ List<int>.

    Vielleicht ist out nicht die beste Wahl, aber da die Instanz von List in der Methode erzeugt werden sollte, ergab sich dies für mich so. Mir ging es nur darum, aufzuzeigen, dass die Möglichkeit besteht, statt des Rückgabewertes, einen oder mehrere Parameter zu verwenden um die gewünschten Werte zurück zu geben.

    Was die geeignetste Variante für den OP ist werde ich nicht entscheiden, dass wird dieser schon selbst tun. Ich stelle hier nur Informationen zur Verfügung die bei der gestellten Frage helfen könnten.

    Ich finde die von Dir gezeigte Variante im übrigen gut, die Erklärung dazu nicht.


    - Gruß Florian

    Donnerstag, 29. August 2019 16:28
  • Hallo Florian

    Bei Übergabe ohne eines der Schlüsselwörter handelt es sich um eine Wertkopie
    Da die zitierte Dokumentation dies so allgemein behauptet

    da kann ich dir nicht wirklich zustimmen.

    Die von dir "zitierte" (war eigentlich gar kein Zitat, sondern eine Interpretation des dortigen Texts) Doku schreibt:

    Parameter, die ohne in, ref oder out für eine Methode deklariert werden, werden nach Werten an die aufgerufene Methode übergeben.

    im englischen Original:

    Parameters declared for a method without in, ref or out, are passed to the called method by value.

    Das ist was ganz anderes als eine "Wertekopie". Genau das ist es nämlich im Falle eine Verweis nicht.

    Allerdings halte ich die Doku an der Stelle dennoch für falsch oder zumindest für so komisch geschrieben, dass man es als Normalsterblicher eigentlich nur falsch interpretieren kann:

    That value can be changed in the method, but the changed value will not be retained when control passes back to the calling procedure.

    Das stimmt zwar bei Wertetypen aber nicht bei Verweistypen. Da wäre eine Klarstellung evtl. sinnvoll gewesen.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Donnerstag, 29. August 2019 20:56
    Moderator
  • Ich finde dein Beispiel auch gut und das Thema ist auch wichtig. Ich lese deine Antworten hier im Forum immer gern da ich meist etwas dazu lerne.

    Auf dem ersten Blick schein C# recht einfach zu sein. Je tiefer man gräbt umso Komplexer wird das ganze. Ich habe mal in einer Doku von MS gelesen das die Idee hinter C# ist, eine einfach Programmiersprachen anzubieten mit der man Programmieren kann ohne die Hintergründe zu verstehen oder verstehen zu müssen. Ich versuche auch so meine Antworten zu verfassen so dass sie immer einfach versanden werden und damit die Programmierung einfach bleibt, was sie natürlich nicht ist.

    So gut wie jeder Mensch auf diesem Planeten hat schon mal einen Hammer benutzt. Kaum einer dieser Menschen würde einen Gedanken daran verschwänden das der Hammer aus einem anderen Stahl ist als der Nagel selbst. Es ist auch für die Aufgabe eine Nagel in die Wand zu treiben nicht wichtig. Eine Firma die Hämmer herstellt weiß ganz genau welche Stahl zu nehmen ist und hat vielleicht ihre eigene Rezeptur.

    Ich habe deine Frage nicht beantwortet da ich zu einem Geburtstag musste und meine Frau mich aus dem Auto angerufen hat das ich endlich kommen soll.

    Ich hätte deine Frage nicht zu deiner Zufriedenheit beantworten können. Du hast auch andere Maßstäbe als ich und das ist auch gut so. So können wir uns alle ergänzen um jedem TE helfen das ganze besser zu verstehen.

     


    Gruß Thomas
    13 Millionen Schweine landen jährlich im Müll
    Dev Apps von mir: UWP Segoe MDL2 Assets, UI Strings

    Donnerstag, 29. August 2019 21:22
  • Hallo Stefan,

    das was ich aus der Dokumentation so entnommen und sinngemäß zitiert habe ist korrekt, es ist ein Aufruf "by Value" - was nichts anderes bedeutet, als das eine Wertkopie erstellt wird. Den Hintergrund dazu habe ich in meiner Antwort direkt über deiner Antwort erläutert. Ich habe das Gestern auch noch einmal nachgelesen, weil mich deine Auslegung dazu irritiert hatte und ich ein Verständnisproblem meinerseits annahm.

    Der Hintergrund bei C# ist, dass Variablen die auf Objekte zeigen, immer nur Verweise (Referenzen) auf diese Objekte als Wert enthalten. Die Wertkopie einer Referenz (eines Verweis) enthält eine Referenz auf das gleiche Objekt.

    Die entsprechende Dokumentation dazu: Verweistypen (C#-Referenz)


    - Gruß Florian

    Freitag, 30. August 2019 07:18
  • Ich finde dein Beispiel auch gut und das Thema ist auch wichtig. Ich lese deine Antworten hier im Forum immer gern da ich meist etwas dazu lerne.

    Vielen Dank.

    Auf dem ersten Blick schein C# recht einfach zu sein. Je tiefer man gräbt umso Komplexer wird das ganze. Ich habe mal in einer Doku von MS gelesen das die Idee hinter C# ist, eine einfach Programmiersprachen anzubieten mit der man Programmieren kann ohne die Hintergründe zu verstehen oder verstehen zu müssen. Ich versuche auch so meine Antworten zu verfassen so dass sie immer einfach versanden werden und damit die Programmierung einfach bleibt, was sie natürlich nicht ist.

    Ja, Einfachheit erleichtert den Einstieg. Ich denke das man C# ohne viel Hintergrundwissen nutzen kann, zumindest bis zu einem gewissen Grad.

    Ich hätte deine Frage nicht zu deiner Zufriedenheit beantworten können. Du hast auch andere Maßstäbe als ich und das ist auch gut so. So können wir uns alle ergänzen um jedem TE helfen das ganze besser zu verstehen.

    Ich denke schon, das du es beantworten könntest - sonst hätte ich nicht gefragt (Es muss auch nicht alles prompt beantwortet werden ;) ). Ich lerne auch gern dazu, dafür lese ich dann gerne im Forum.


    - Gruß Florian

    Freitag, 30. August 2019 07:49
  • Hallo Florian,

    eine Wertkopie ist etwas anderes als ein Wert, ein Verweis, ... Alleine schon von der Begrifflichkeit passt "Kopie" hier nicht.

    Aber sei's drum, letztendlich meinen wir dennoch dasselbe von daher belassen wir es einfach dabei.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Freitag, 30. August 2019 09:32
    Moderator
  • Wenn wir dann schon beim Lob sind, möchte ich tklustig loben.

    Für dein Durchhaltevermögen, deine Kritikfähigkeit, uns vor allem für deine Lernbereitschaft.

    Auch wenn Du C# noch nicht beherrscht, bist Du in meinen Augen ein guter Entwickler


    Gruß Thomas
    13 Millionen Schweine landen jährlich im Müll
    Dev Apps von mir: UWP Segoe MDL2 Assets, UI Strings


    Freitag, 30. August 2019 10:06
  • eine Wertkopie ist etwas anderes als ein Wert, ein Verweis, ... Alleine schon von der Begrifflichkeit passt "Kopie" hier nicht.

    Eine Wertkopie ist etwas anderes als ein Wert, das stimmt. Kopie passt perfekt. Was passiert denn bei einer Wertübergabe? Es wird in den Speicher für die Wertübergabe (der Speicher, der in der Methode bezeichneten Variable) der Wert kopiert, wir haben in der Methode also eine Wertkopie. Die Alternative in C# ist der Verweis, da nutzen wir den referenzierten Speicher, also gerade keine Kopie.

    Weitere Wege in anderen Programmiersprachen wären zum Beispiel Registeradressen oder Zeiger, das wären auch keine Kopien.

    Mal ein einfaches Beispiel, mit einer simplen Klasse. Gegeben sei diese Klasse something:

    public class something
    {
     private int einWert;
     public void setzeWert()
     {
      einWert = 0;
     }
     public void erhoeheWert()
     { einWert++;}
    }

    Eine einfache Methode tuewas():

    static void tuewas(something wert)
    {
     wert.erhoeheWert();
     wert = new something();
     wert.setzeWert();
    }

    Jetzt erstellen wir diese Klasse und setzen den Wert, mit der Methode setzeWert:

    something meinS = new something();
    meinS.setzeWert();

    meinS.einWert ist demnach jetzt gleich 0. Anschließend folgt der Aufruf von tuewas:

    tuewas(meinS);
    Nun, welchen Wert hat danach meinS.einWert?

    Ich verrate es der Einfachheit halber, der Wert ist 1. Der Grund dafür ist, dass wir eine Kopie in der Methode nutzen und somit die neue Zuweisung eines Objektes für den Aufrufer keine Rolle spielt.

    Jetzt ändere die Methode und stelle ref dem Parameter voran, und rufe anschließend die Methode mit ref vor der Variablen auf.
    Welchen Wert hat danach meinS.einWert?
    Der Wert ist dann 0. Der Grund hierfür, die Methode nutzt keine Kopie und die Zuweisung des Objektes spielt für den Aufrufer eine Rolle.

    Ich denke das Beispiel macht deutlich, dass Objekte nicht einfach als Referenz übergeben werden. Ich denke es ist wichtig sich dessen bewusst zu sein.


    - Gruß Florian



    Freitag, 30. August 2019 11:19
  • Das verhalten ist aber auch so zu erwarten

    Ich habe das ganze mal in meinem Programm mit Kommentaren nachgestellt

    public class something
    {
        private int einWert;
        public void setzeWert()
        {
            einWert = 0;
        }
        public void erhoeheWert()
        { einWert++; }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
    
            something meinS = new something();
            meinS.setzeWert();
    
            tuewas(meinS);
    
            var la = 123;
        }
    
        static void tuewas(something wert)
        {
            //wert ist nur ein lokaler pointer
            wert.erhoeheWert();
    
            //hier wird eine neue Instanz der Klasse erstellt aber eben auf den lokalen pointer
            wert = new something();
            wert.setzeWert();
            //hier verliert die neue Instanz der Klasse ihre gültigkeit
        }
    }

     

    Ob nun Pointer der richtig Ausdruck dafür ist sei mal dahingestellt. Lokal wiegt nun mal immer mehr als global

    Dieses verhalten ist mehr oder weniger identisch mit diesem hier 

    class Program
        {
            static int foo = 0;
            static void Main(string[] args)
            {
                Console.WriteLine("Hello World!");
    
                foo++;
    
                tuewas();
            }
    
            static void tuewas()
            {
                int foo = 0;
    
            }
        }

    Aber stimmt das sollte man wissen. So eine Fehler später zu finde wird schwierig.

    Der Grund dafür dürfte ja am Stack liegen. Nach verfassen von tuetwas wird Main aus den Stack geholt und geschaut ob etwas sich geändert hat. Da die lokale Instanz der Klasse ihre Gültigkeit verloren hat sich eben nix geändert  


    Gruß Thomas
    13 Millionen Schweine landen jährlich im Müll
    Dev Apps von mir: UWP Segoe MDL2 Assets, UI Strings







    Freitag, 30. August 2019 12:06