Laden...

Variablen Namen und Variablen Scope

Erstellt von Xqgene vor 18 Jahren Letzter Beitrag vor 18 Jahren 1.565 Views
X
Xqgene Themenstarter:in
2.051 Beiträge seit 2004
vor 18 Jahren
Variablen Namen und Variablen Scope

Dieses Bsp:

        static void Main(string[] args)
        {
            for (int i = 0; i < 5; i++)
            {
                // TODO:
            }

            int i = 0;  // ß----
        }

Spuckt folgende Fehlermeldung aus:

A local variable named 'i' cannot be declared in this scope because it would give a different meaning to 'i', which is already used in a 'child' scope to denote something else

Das kann ich noch verstehen, wenn ich das Bsp. in der Beschreibung zu der Meldung angucke:

namespace MyNamespace
{
   public class MyClass
   {
      public static void Main()
      {
         int i = 0;
         {
            char i = 'a';   // CS0136, hides int i
         }
         i++;
      }
   }
}

Jetzt meine Überlegung ist, dass es dann theoretisch auch so gehen sollte:

        static void Main(string[] args)
        {
            for (i = 0; i < 5; i++)
            {
                // TODO:
            }

            int i = 0;
        }

Was natürlich Quatsch ist und die Compilierung mit einer „The name 'i' does not exist in the current context“-Fehlermeldung in der for-Schleife endet.

Die beiden Meldungen schließen sich doch gegenseitig aus. Oder sieht ihr das anders?

For allem verstehe ich nicht, warum es Probleme beim ersten Beispiel gibt.

Wenn ich an die guten alten C++ Zeiten denke, ging das problemlos.

2.082 Beiträge seit 2005
vor 18 Jahren

Hallo Xqgene,

static void Main(string[] args)
        {
            for (i = 0; i < 5; i++)
            {
                // TODO:
            }

            int i = 0;
        } 

Kann nicht funktionieren, da i vor der for-Schleife definiertwerden muss. Du hast diese aber nach der for-Schleife definiert.

Wer mit c++ oder c programmiert hat, weiß, dass das ebenfalls bei methoden so ist.

Damit das Programm weiß, dass es das gibt, musst du dem Programm vorher erst sagen, dass es das gibt.
Ein Compiler hat keine eigene Intelligenz!

//Edit

Wenn ich an die guten alten C++ Zeiten denke, ging das problemlos.

nicht wirklich! Du musstest, um eine Methode zu nutzen, die hinter der main lag, erst deklarieren (prototypen erstellen) sonst ging das auch nicht.

Es ist toll jemand zu sein, der nichts von der persönlichen Meinung Anderer hält. - frisch-live.de

X
Xqgene Themenstarter:in
2.051 Beiträge seit 2004
vor 18 Jahren

ich meinte damit das erste Bsp:

static void Main(string[] args)
        {
            for (int i = 0; i < 5; i++)
            {
                // TODO:
            }

            int i = 0;  // <----
        }
6.862 Beiträge seit 2003
vor 18 Jahren

Original von Xqgene
ich meinte damit das erste Bsp:

static void Main(string[] args)  
        {  
            for (int i = 0; i < 5; i++)  
            {  
                // TODO:  
            }  
  
            int i = 0;  // <----  
        }  

Die Fehlermeldung sagts doch schon das I in nem Childscope benutzt wird und durch des zweite i uneindeutig wird - welches den Vorrang hat, da es den größeren Scope besitzt. Den Scope kannst du in dem Sinne gleich setzen mit den Klammerungsebenen. Dein zweites i ist in der ganzen Funktion bekannt, dein erstes in der Schleife die innerhalb in der Funktion ist(deshalb child scope).

Ausschließen tun sich die Meldungen nicht, da im ersten Fall zwei Variablen benutzt werden, im zweiten Fall aber nur eine, warum die noch nicht bekannt ist hat ja frisch schon erwähnt.

Baka wa shinanakya naoranai.

Mein XING Profil.

X
Xqgene Themenstarter:in
2.051 Beiträge seit 2004
vor 18 Jahren

wie kann denn die "funktionsscoped"-I uneindeutig sein, wenn diese in der Schleife noch gar nicht bekannt ist?

oder auch andersrum:

wenn ich eine Klassevariable I habe, gibt es in der Schleife auch kein Problem mit dem Parent-/Child-Scope. Diese kann der Compiler ohne weiteres auseinander halten, warum denn nicht in dem obigen Beispiel?

2.082 Beiträge seit 2005
vor 18 Jahren

Meinst du Membervariable? Also so:

class MyClass {
 int i = 0;

 private void GetZahl() {
  for(int i = 0; i < 10; i++) {
  }
 }
}

In der Schleife wird somit nicht die Membervariable benutzt. Das liegt an der Hierarchie.

Funktionsvariable vor Membervariable.

//Edit verschrieben 🤔

Es ist toll jemand zu sein, der nichts von der persönlichen Meinung Anderer hält. - frisch-live.de