Fehler CS0136



  • Hallo,

    bei uns ist gerade (aus Versehen) eine Konstellation ähnlich der diesen aufgetreten:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace Test
    {
    	class Program
    	{
    		static void Main( string[] args )
    		{
    			int i = 0;
    			if( i == 0 )
    			{
    				bool x = true;
    			}
    
    			bool x = false;
    		}
    	}
    }
    

    Das (Zeile 18) wird mit dem "Fehler CS0136" belohnt:

    Eine lokale Variable mit dem Namen "x" kann in diesem Bereich nicht deklariert werden, weil dadurch "x" eine andere Bedeutung erhalten würde, was bereits im Bereich "untergeordnet" in anderer Bedeutung verwendet wird.

    Warum ist das ein Fehler/verboten? Ich verstehe es nicht. Stehe ich auf dem Schlauch oder ist das Sinnbefreit?



  • Im Bytecode werden alle Variablen am Anfang der Mothode deklariert egal wo die im Quelltext stehen. Also hast du in der Methode ein bool x stehen und in dem if ebenso und das fard nicht sein. Umgangen kann das Problem im dem du oben in der Methode bool x deklarierst und im if -Block nur der variable einen Wert zuweist ohne Deklaration.



  • Hi Rhombicosidodecahedron,

    vielen Dank für die Antwort.

    Rhombicosidodecahedron schrieb:

    Im Bytecode werden alle Variablen am Anfang der Mothode deklariert egal wo die im Quelltext stehen.

    OK, das ist sehr interessant. Der Reflector hat Dir auch gleich Recht gegeben. 😃

    Was ist aber jetzt der große Unterschied hierzu:

    for( int i = 0; i < 10; ++i )
    {
      // ...
    }
    
    for( int i = 0; i < 10; ++i )
    {
      // ...
    }
    

    ???

    Hier legt er jetzt auch einfach am Anfang _EINE_ Variable an. Das ginge doch im obigen Beispiel auch, da sich die Scopes der beiden x'e nicht überschneiden!?



  • void* schrieb:

    Was ist aber jetzt der große Unterschied hierzu:

    for( int i = 0; i < 10; ++i )
    {
      // ...
    }
    
    for( int i = 0; i < 10; ++i )
    {
      // ...
    }
    

    ???

    Hier legt er jetzt auch einfach am Anfang _EINE_ Variable an. Das ginge doch im obigen Beispiel auch, da sich die Scopes der beiden x'e nicht überschneiden!?

    Versuch mal auf eine Variable zuzugreifen die du in der For schleife deklariert hast.

    Gruss



  • Hier geht es nicht ums Zugreifen, sondern um das mehrfache deklarieren von Variablen mit gleichem Namen und gleichem Typ in der gleichen Methode deren Scope sich _NICHT_ überschneidet.
    Dies ist in beiden Beispielen der Fall. Aber mit der for-Schleife ist es legal, im ersten Beispiel nicht. Den Sinn dahinter verstehe ich nicht.



  • void* schrieb:

    Den Sinn dahinter verstehe ich nicht.

    Dann stell Doch mal Deine Annahme in Frage...



  • Welche Annahme??? 😕



  • void* schrieb:

    Hier geht es nicht ums Zugreifen, sondern um das mehrfache deklarieren von Variablen mit gleichem Namen und gleichem Typ in der gleichen Methode deren Scope sich _NICHT_ überschneidet.
    Dies ist in beiden Beispielen der Fall.

    Das ist eine (falsche) Annahme.


Anmelden zum Antworten