Laden...

Delegaten - Ohne else keine zugewiesene Variable

Erstellt von User30742 vor 6 Jahren Letzter Beitrag vor 6 Jahren 1.168 Views
U
User30742 Themenstarter:in
26 Beiträge seit 2018
vor 6 Jahren
Delegaten - Ohne else keine zugewiesene Variable

Hallo,
ich habe heute etwas geübt und bin auf etwas, aus meiner Sicht, merkwürdiges gestoßen.
Schreibt man folgenden Code:


using static System.Console;

public delegate double MyDelegate(double value1, double value2);
        static void Main(string[] args)
        {
            MyDelegate bezeichner;
            WriteLine("Einführungstext");
            Console.Write("Erste Zahl: ");
            double input1 = Convert.ToDouble(ReadLine());
            Console.Write("Zweite Zahl: ");
            double input2 = Convert.ToDouble(ReadLine());
            Console.WriteLine("Soll subtrahiert oder addiert werden? A für Addition, S für Subtraktion.");
            string input3 = ReadLine().ToUpper();
            if (input3 == "A")
            {
                bezeichner = Klasse.Addieren;
            }
            else if (input3 == "S")
            {
                bezeichner = delegate (double x, double y)
                {
                    return x - y;
                };
            }
            /*else
            {
                WriteLine("Ungültige Eingabe");
                ReadKey();
                return;
            } */
            double ergebnis = bezeichner(input1, input2);
            WriteLine($"Ergebnis: {ergebnis}");
            ReadKey();

erscheint bei verwendung des Delegaten bezeichner eine Fehlermeldung:> Fehlermeldung:

Fehler CS0165 Verwendung der nicht zugewiesenen lokalen Variablen "bezeichner".

Die derzeitige Lösung, um das zu beheben, ist den auskommentierten Code zu verwenden.

Warum muss ich das else geschrieben haben, damit der Delegat normal ausgeführt werden kann?

P
1.090 Beiträge seit 2011
vor 6 Jahren

Das Liegt am return.

Durch das return im den else Block wird sichergestellt das der Delegate nicht ausgeführt wird wenn er nicht zugewiesen wurde.

Sollte man mal gelesen haben:

Clean Code Developer
Entwurfsmuster
Anti-Pattern

C
224 Beiträge seit 2009
vor 6 Jahren

Palin war schneller ....

Hier meine Antworten:



MyDelegate bezeichner; //hier hast du "bezeichner" nichts zugewiesen
MyDelegate bezeichner = null; //hier hast du "bezeichner" den null-Wert zugewiesen

//--------------------------------------

MyDelegate bezeichner;
if (input3 == "A")
{
    bezeichner = Klasse.Addieren;
}
else
{
    WriteLine("Ungültige Eingabe");
    ReadKey();
    return;
}

double ergebnis = bezeichner(input1, input2);
//Der Compiler erkennt, dass die Variable zugewiesen wird, oder Du rausgehst.


//--------------------------------------


MyDelegate bezeichner;
if (input3 == "A")
{
    bezeichner = Klasse.Addieren;
}

double ergebnis = bezeichner(input1, input2);
//Der Compiler erkennt, dass wenn input3 != "A" ist, dass dann bezeichner nichts (noch nicht mal der null-Wert) zugewiesen ist.


//--------------------------------------


MyDelegate bezeichner = null;
if (input3 == "A")
{
    bezeichner = Klasse.Addieren;
}

double ergebnis = bezeichner(input1, input2);
//Der Compiler erkennt, dass Du immer was zugewiesen hast (Klasse.Addieren oder null-Wert) und meckert nicht. Obwohl eine NullReferenceException ausgelöst werden kann.