Nullable Types - Was mache ich falsch bei der Kurzschreibweise?



  • Hi

    Bin bei meinem Buch bei den Nullable Types angelangt und anhand des Buches müsste die Kurzschreibewese von

    Nullable<int> i = new Nullable<int>();
    
                if (i == null)
                    i = 10;
    

    so aussehen:

    int? i;
    
                if (i == null)
                    i = 10;
    

    Nur führt das zum Compilefehler:
    Use of unassigned local variable 'i'

    Was mache ich falsch?



  • Sagt doch die Fehlermeldung schon: i wurde kein Wert zugewiesen (auch nicht null).



  • Hmm, ja dann muss ich der Variable wohl wirklich null zuweisen. Dann ist aber auch das Beispiel im Buch falsch.

    Danke für die Hilfe.



  • der Compiler erkennt das du 10 nur in einer Bedingungsprüfung zu weist.
    Und wenn du nichts zu weist, dann ist int? ungültig, da es dann das selbe ist wie

    Nullable<int> i;
    int value = i.Value; // Der Compiler weiß das i vorher nichts zugewiesen wurde.

    => Es fehlt das Objekt, und das erkennt der Compiler für dich bereits vorher.
    Ich vermute das du irgendwo Zugriff auf i hast.



  • Nein, das war das ganze Programm 😉

    All das war in der main-Methode. Aber wen ich int i? = null schreibe, dann gehts.



  • Is ja klar, du hast ne Definition aber keine Deklaration, wenn es auch nur als null definiert wird.

    warum glaubst du du kannst bei der Kurzschreibweise die Zuweisung weg lassen?
    In C# müssen alle Objekte eine Zuweisung erhalten es sie benutzbar sind, einfach weil sie eine Referenz brauchen, uns sei es einfach nur eine null referenz.

    static void Main(string[] args)
    {
        string nothing;
    
        Console.WriteLine(nothing); // Error: Use of unassigned local variable 'nothing'
    }
    


  • CSL schrieb:

    Is ja klar, du hast ne Definition aber keine Deklaration, wenn es auch nur als null definiert wird

    Ich hab ne Deklaration aber keine Definition. Oder werden diese Ausdrücke in C# anders verwendet als ich es kenne? Eine Definition impliziert ja eine Deklaration.

    CSL schrieb:

    warum glaubst du du kannst bei der Kurzschreibweise die Zuweisung weg lassen?
    In C# müssen alle Objekte eine Zuweisung erhalten es sie benutzbar sind, einfach weil sie eine Referenz brauchen, uns sei es einfach nur eine null referenz.

    Ich dachte man könne das so machen, weil es so im Buch steht (das Beispiel hat wohl einen Fehler drin). Bei Java werden Instanzvariablen automatisch initialisiert mit einem Default-Wert... hätte ja sein können, dass das bei C# auch in Methoden der Fall ist.

    Naja, dank euch weiss ichs jetzt besser 😉 Danke.



  • icarus2 schrieb:

    CSL schrieb:

    Is ja klar, du hast ne Definition aber keine Deklaration, wenn es auch nur als null definiert wird

    Ich hab ne Deklaration aber keine Definition. Oder werden diese Ausdrücke in C# anders verwendet als ich es kenne? Eine Definition impliziert ja eine Deklaration.

    Ups, vertippt - man sollte erst richtig wach sein bevor man was schreibt ^^ meinte es umgekehrt 😃

    icarus2 schrieb:

    CSL schrieb:

    warum glaubst du du kannst bei der Kurzschreibweise die Zuweisung weg lassen?
    In C# müssen alle Objekte eine Zuweisung erhalten es sie benutzbar sind, einfach weil sie eine Referenz brauchen, uns sei es einfach nur eine null referenz.

    Ich dachte man könne das so machen, weil es so im Buch steht (das Beispiel hat wohl einen Fehler drin). Bei Java werden Instanzvariablen automatisch initialisiert mit einem Default-Wert... hätte ja sein können, dass das bei C# auch in Methoden der Fall ist.

    Naja, dank euch weiss ichs jetzt besser 😉 Danke.

    Was ist das für ein Buch?

    Nur Member einer klasse bekommen ein default Wert (oder eben null) innerhalb von Methoden nicht.
    Aber ich finde das auch etwas inkonsistent -.-

    public class Demo
    {
        private int _value; // Warnung in VS das nichts zugewiesen wurde und 0 verwendet wird.
    
        public void ShowMember()
        {
            Console.WriteLine(_value);
        }
    
        public void ShowInstance()
        {
            int value;
            Console.WriteLine(value); // Compiler Fehler
        }
    }
    


  • Ja dann ist es gleich wie bei Java, dass nur Membervariablen automatisch initialisiert werden.

    Es ist das hier. Dravere hatte es in einem anderen Thread erwähnt. Ich bin eigentlich sehr zufrieden mit dem Buch.


Anmelden zum Antworten