Entwickler-Ecke
C# - Die Sprache - Compilerfehler: Keine Überladung für die "Methode"-Methode
Morjo - Mo 01.12.08 01:44
Titel: Compilerfehler: Keine Überladung für die "Methode"-Methode
Hallo zusammen,
ich kämpfe gerade in einer simplen Visual-C#-Anwendung mit einem mir nicht nachvollziehbarem Fehler:
Zitat: |
Keine Überladung für die FileHandler-Methode nimmt 1 Argumente an. |
Hier der Code:
Main-Methode in der Program.cs:
C#-Quelltext
1: 2: 3: 4: 5: 6:
| static void Main(String[] args) { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1(args)); } |
Entsprechende Main-Methode in Form1.cs:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| public Form1(String[] args) { InitializeComponent();
if (args.Length == 0) { } else { String filename = args[0]; String file = new FileHandler(filename); } } |
Entsprechende Main-Methode in FileHandler.cs:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| public String Main(String filename) { FileStream fs = new FileStream(@filename, FileMode.Open); StreamReader sr = new StreamReader(fs);
String s = sr.ReadToEnd();
sr.Close(); fs.Close();
return s; } |
Der Fehler erscheint in der Regel nur, wenn die Anzahl der Argumente beim Aufruf der Methode nicht mit der Anzahl der benötigten Argumente überein stimmt. Beim Aufruf von FileHandler wird ein Argument (String filename) übergeben. Der Construktor benötigt aber auch nur ein Argument (ebenfalls String filename).
Woran liegt es, dass hier ein Fehler ausgegeben wird? Leider habe ich bisher keinen Grund finden können...
Ich würde mich über Eure Hilfe sehr freuen!
Danke & Viele Grüße
Morjo
Christian S. - Mo 01.12.08 01:53
Hallo und :welcome:!
Die Main-Methode des FileHandler nützt hier wahrscheinlich wenig, weil die (zumindest in den geposteten Quelltexten) nie aufgerufen wird. Die Main-Methode ist nicht der Konstruktor!
Grüße
Christian
//edit: Was Du postest sieht aus wie ein Compiler-Fehler und keine Exception, sollte also zur Compile-Zeit und damit unabhängig von den übergebenen Argumenten erscheinen?
JüTho - Mo 01.12.08 10:46
Hallo und ebenfalls :welcome:
Ergänzend zu Christians Antwort habe ich noch folgende Hinweise:
SDK-Doku/MSDN hat folgendes geschrieben: |
Main() und Befehlszeilenargumente
- Die Main-Methode ist der Einstiegspunkt des Programms, an dem Objekte erstellt und andere Methoden aufgerufen werden.
- Es kann nur einen Einstiegspunkt in einem C#-Programm geben.
- Sie wird innerhalb einer Klasse oder Struktur deklariert. Sie muss statisch sein und sollte nicht öffentlich sein. (Im Beispiel oben erhält sie den Standardzugriff und ist somit als privat deklariert.)
- Sie kann entweder den Rückgabetyp void oder int haben.
|
Deine Main-Methode in FileHandler.cs steht in
Widerspruch zu allen diesen Bedingungen. Bitte unbedingt umbenennen! (Ich benutze in ähnlichen Situationen eine Init-Methode.)
Außerdem rufst Du im Formular den Konstruktor von FileHandler mit einem Argument auf, aber es scheint keinen Konstruktor mit einem Argument zu geben. Deine Main-Methode ist kein Konstruktor! (Ein Konstruktor hat keinen Rückgabewert.) Du musst also die Zusammenarbeit zwischen dem Formular und dem FileHandler grundsätzlich ändern: einfacher Konstruktor, dazu Init-Methode.
Gruß Jürgen
Morjo - Mi 03.12.08 20:58
Hallo Christian und Thomas,
vielen Dank für die freundlichen Willkommensgrüße und auch für die hilfreichen Antworten. Da hatte ich mich wirklich in dem Glauben verrannt, die Main-Methode sei der Construktor :)
Wie folgt habe ich das Ganze nun gelöst:
Form1.cs
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| public Form1(String[] args) { InitializeComponent();
if (args.Length == 0) { label1.Text = "keine Logdatei definiert"; } else { String filename = args[0]; FileHandler file = new FileHandler(filename); if (file.ReadLogfile() != "") { label1.Text = "doll"; } } } |
FileHandler.cs
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| class FileHandler { private String _filename; public FileHandler(String filename) { _filename = filename; }
public String ReadLogfile() { FileStream fs = new FileStream(_filename, FileMode.Open); StreamReader sr = new StreamReader(fs);
String s = sr.ReadToEnd();
sr.Close(); fs.Close();
return s; } } |
Danke nochmals & Viele Grüße
Mario
Edit: @Christian: ja, das war ein Compiler-Fehler (s. Topic ;)). Bin darauf im
http://msdn.microsoft.com/de-de/library/d9s6x486.aspx aufmerksam geworden.
JüTho - Do 04.12.08 10:51
Hallo,
noch zwei konkrete Ergänzungen:
Morjo hat folgendes geschrieben : |
C#-Quelltext 1:
| if (file.ReadLogfile() != "") | |
Besser ist diese dafür vorgesehene und noch sicherere Abfrage:
C#-Quelltext
1:
| if( ! String.IsNullOrEmpty(file.ReadLogfile()) ) |
Instanzen, die mit
Dispose arbeiten, sollten in einen
using-Block gekapselt werden. Erkennbar ist das daran, dass die Klasse über
IDisposable verfügt; siehe in der
SDK-Doku/MSDN auf der Seite "Informationen über...". Vorteil ist, dass die Instanz auf jeden Fall nur beschränkte Gültigkeit hat und sowohl Close als auch Dispose automatisch ausgeführt werden. Beispiel:
C#-Quelltext
1: 2: 3: 4: 5: 6:
| using( FileStream fs = new FileStream(_filename, FileMode.Open) ) { StreamReader sr = new StreamReader(fs); String s = sr.ReadToEnd(); sr.Close(); } |
Gruß Jürgen
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!