Entwickler-Ecke

Basistechnologien - Inkonsistenter Zugriff? Enum-Problem


FabianClassen - Di 16.06.09 17:30
Titel: Inkonsistenter Zugriff? Enum-Problem
Hi
ich bin neu in Sachen C#, kann aber auch mäßig Java und habe mir einen leichten Einstieg erhofft.
Mein erstes Projekt sollte ein Programm werden, dass ein Passwort darauf überprüft, ob es einigermaßen sicher ist.

Mein Programm soll in der Konsole ausgeführt werden und ich habe mir eine Prozedur geschrieben, die einen Text in der Konsole zentrieren soll. Damit man bestimmen kann, ob ein LineBreak vor oder nach dem Text gesetzt werden soll, habe ich ein Enum erstellt, welches dann via Parameter übergeben werden kann und in der Prozedur ausgewertet wird.
Aber es kommt folgende Fehlermeldung und ich denke, dass diese auch durch meine Lösung mit dem Enum herbeigeführt wird.

Die Fehlermeldung lautet:

Quelltext
1:
Inkonsistenter Zugriff: Parametertyp "PasswortChecker.Program.LineBreak" ist weniger zugreifbar als Methode "PasswortChecker.Program.CenterText(string, PasswortChecker.Program.LineBreak)"                    


und das ist mein Programmcode:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
using System;
using System.Text;

namespace PasswortChecker
{
    class Program
    {
        private enum LineBreak { Before = 1, After = 2 };
        delegate void Count();

        static void Main(string[] args)
        {
            Console.ForegroundColor = ConsoleColor.Yellow;
            CenterText("PasswortChecker", LineBreak.After);
            CenterText("by Fabian Classen", LineBreak.Before);
            Console.ReadKey();
        }

        public static void CenterText(string text, LineBreak lb)
        {
            int l = text.Length;
            int count = 40 - l / 2;

            Count MyCount = delegate() {
                for(int i=1; i<count; i++) {
                    Console.Write(" ");
                }
            };

            if (lb == LineBreak.Before)
            {
                Console.WriteLine("");
                MyCount();
                Console.WriteLine(text);
            }
            else if (lb == LineBreak.After)
            {
                MyCount();
                Console.WriteLine(text);
            }
        }
    }
}


Ich hoffe ihr könnt mir helfen ;)
Ich freue mich schon auf eure Antworten.

MFG
Fab
;)


FabianClassen - Di 16.06.09 17:57

Ich habe die Lösung für das Problem selbst gefunden.
Ich musste die enum außerhalb der Klasse definieren ;)

MFG
Fab
;)


JüTho - Di 16.06.09 19:18

Hallo Fabian,

ich glaube, dass das nur "aus Versehen" so funktioniert. Das Problem ist die Zusammenarbeit zwischen der public-Methode CenterText und der private-Enumeration. Innerhalb der Program-Klasse mit der statischen Main-Methode wird es noch komplizierter.

Im Moment lohnt sich eine weitere Änderung vermutlich nicht; aber künftig solltest du immer genau bedenken, was als public oder private deklariert werden muss.

Gruß Jürgen


FabianClassen - Di 16.06.09 20:44

Ich habe das ganze auch mit einem public enum versucht und es hat erst geklappt, als ich die enum außerhalb der klasse im namespace definiert habe.

Siehe hier:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
using System;
using System.Text;

namespace PasswortChecker
{
    public enum LineBreak { None = 0, Before = 1, After = 2 }

    class Program
    {
        delegate void Count();

        static void Main(string[] args)
        {
            Console.ForegroundColor = ConsoleColor.Yellow;
            CenterText("PasswortChecker", LineBreak.After);
            CenterText("by Fabian Classen", LineBreak.Before);

            CenterText("Zum beenden drücken sie eine beliebige Taste ...", LineBreak.Before);
            Console.ReadKey();
        }

        public static void CenterText(string text, LineBreak lb)
        {
            int l = text.Length;
            int count = 40 - l / 2;

            Count MyCount = delegate() {
                for(int i=1; i<count; i++) {
                    Console.Write(" ");
                }
            };

            if (lb == LineBreak.Before)
            {
                Console.WriteLine("");
                MyCount();
                Console.WriteLine(text);
            }
            else if (lb == LineBreak.After)
            {
                MyCount();
                Console.WriteLine(text);
            }
            else if (lb == LineBreak.None)
            {
                MyCount();
                Console.Write(text);
            }
        }
    }
}


MFG
Fab
;)