Autor Beitrag
KeepItSimple
Hält's aus hier
Beiträge: 5

Win XP, Debian Etch
Java (JBuilder 2006), C++ (VS 2005), C# (VS 2005)
BeitragVerfasst: Do 26.10.06 00:30 
Hallo zusammen,

ich beschäftige mich gerade mit dem Buch "Visual C# 2005", bin da aber noch bei Konsolenprogrammen.
Der Autor behandelt gerade Ereignisse und ich versuche das nachzucoden. Allerdings scheitert das Ganze immer aus einem mir unverständliche Grund, der sogar auftritt, wenn ich den Quellcode des Autors kopiere. Der Fehler lautet:

"Fehler CS0120: Für das nicht statische Feld, die Methode oder die Eigenschaft "EventTest.Program.RadiusError(EventTest.Circle)" ist ein Objektverweis erforderlich."

Der Fehler betrifft diese Codezeile:

ausblenden C#-Quelltext
1:
kreis.MeasureError += new MeasureErrorEventHandler(RadiusError);					


Zum besseren Verständnis poste ich mal den ganzen Quelltext. Zuerst die Klasse mit Main:

ausblenden 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:
using System;
using System.Collections.Generic;
using System.Text;

namespace EventTest
{
    class Program
    {
        static void Main(string[] args)
        {
            Circle kreis = new Circle();

            kreis.MeasureError += new MeasureErrorEventHandler(RadiusError);
            kreis.Radius = -1;
            Console.ReadLine();
        }

        public void RadiusError(Circle sender)
        {
            Console.WriteLine("Unzulässiger negativer Radius.");
            Console.Write("Neueingabe: ");
            sender.Radius = Convert.ToDouble(Console.ReadLine());
        }
    }
}


Und hier die zweite Klasse:

ausblenden 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:
using System;
using System.Collections.Generic;
using System.Text;

namespace EventTest
{
    public delegate void MeasureErrorEventHandler(Circle c);

    public class Circle
    {
        double radius = 0;
        public event MeasureErrorEventHandler MeasureError;

        public double Radius
        {
            get { return radius; }
            set
            {
                if (value >= 0)
                    radius = value;
                else if (MeasureError != null)
                    MeasureError(this);
            }
        }
    }
}


Ich kann mir den Fehler nicht erklären, da ich in C# noch nicht so gut bin und alles so gemacht habe, wie der Autor schreibt. Falls mir jemand helfen kann, wäre ich sehr dankbar.

Vielen Dank im voraus.

Gruß Tom
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Do 26.10.06 10:13 
Hallo!

Die Main-Methode einer Konsolenanwendung ist statisch, dass heißt sie ist eine Klassenmethode. Nun ist RadiusError aber eine nicht-statische Methode, die also zu einer Instanz gehört. Daher kannst Du aus einer Klassenmethode nicht drauf zugreifen.

Grüße
Christian

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
KeepItSimple Threadstarter
Hält's aus hier
Beiträge: 5

Win XP, Debian Etch
Java (JBuilder 2006), C++ (VS 2005), C# (VS 2005)
BeitragVerfasst: Do 26.10.06 11:43 
Ahhh ja, Danke.

Ich habe das jetzt in eine weitere Klasse ausgelagert - jetzt gehts! Ich weiß nur nicht, ob das ein gute Lösung ist. Wenn jemand weiß, wie mans besser machen kann, wäre ich sehr erfreut, es zu hören (lesen). Dankeschön.

Hier mal der neue Code:

ausblenden 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:
class Program
  {    
    public static void Main(string[] args)
    {
      Testklasse test = new Testklasse();
      test.TestMethode();
    }
  }
  
  public class Testklasse
  {
    public void TestMethode()
    {
      Circle meinKreis = new Circle();
      meinKreis.MeasureError += new MeasureErrorHandler(RadiusError);
      meinKreis.Radius = -1;
      Console.WriteLine("Radius = {0}", meinKreis.Radius);
      Console.ReadLine();
    }
    
    public void RadiusError(Circle sender)
    {
      Console.WriteLine("Unzulässiger negativer Radius."); 
      Console.Write("Neueingabe: "); 
      sender.Radius = Convert.ToDouble(Console.ReadLine());
    }
  }


Schönen Tag noch

Gruß Tom
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Do 26.10.06 12:50 
Du benötigst keine weitere Klasse. Entweder erstellst du in Main eine Program-Instanz oder deklarierst RadiusError als static.
KeepItSimple Threadstarter
Hält's aus hier
Beiträge: 5

Win XP, Debian Etch
Java (JBuilder 2006), C++ (VS 2005), C# (VS 2005)
BeitragVerfasst: Do 26.10.06 16:41 
Hi,

hab das jetzt mal gemacht mit einer Instanz von "Program". Vielen Dank für den Tip.
Ist das ein üblicher Weg? Ich meine, die Klasse in der sich Main befindet zu instanzieren?
Wie auch immer, ich finde es elegant.

Schönen Gruß
Tom