C# Fehler CS 0177

Stephan78

Ensign
Registriert
Sep. 2010
Beiträge
162
Hallo,

ich bin bei folgendem Codestück am Verzweifeln-
es ist nicht kompilierbar und bringt immer Fehler CS 0177 für die beiden
Output-Variablen, ohne dass ich den Grund dafür erkennen kann.
Kann mir jemand von Euch alten Hasen sagen, wo das Problem liegt? :confused_alt:

Vielen Dank schon im Vorraus!


using System.Text.RegularExpressions;//Regex
using System.IO;//Streamreader
using System.Windows.Forms;//Messagebox
using System.Collections.Generic;//stellt List-Objekt bereit

public void AnfEndwertausgeben(int spaltenindex, string pfad, string trennzeichen, out string anfwert, out string endwert)
{

try
{
// Sets the file the StreamReader will read from StreamReader
sr = new System.IO.StreamReader(pfad);
string zeile;
List<string> spalte = new List<string>();

// Read lines and fill array list. While loop will go through the whole file.
while ((zeile = sr.ReadLine()) != null)
{
// Splits the line at every comma. Places each split into the string array
string[] lines = Regex.Split(zeile, trennzeichen);
spalte.Add(lines[spaltenindex]);
}
anfwert=spalte[0];
int i=spalte.Count;
endwert=spalte[i-1];

}

catch (System.Exception excep)
{
MessageBox.Show(excep.Message);
}


}
 
Und du bist noch nicht auf die Idee gekommen, mal nach dem Fehler zu googeln?
Dann hättest du nämlich folgendes ziemlich schnell gefunden, schneller als es gedauert hat, diesen Beitrag zu schreiben.
 
Was die Fehlermeldung bedeutet,
ist freilich nicht schwer zu begreifen.

Aber: Im Code wird den outputs was zugewiesen,
siehe die drei letzten Zeilen im try-Block.

Ganz so einfach isses leider nicht, aber vielleicht hast Du den Bug ja
schon entdeckt?
 
-Mir fällt nix auf,
aber wenn jemand den Fehler sieht, darf ers gern verraten...
Ich bin C#-Neuling.
 
Es gibt keine Garantie, dass die letzten Zeilen aufgerufen werden. Wenn ein Befehl davor eine Exception wirft, wird der Rest des try-Blocks übersprungen.
 
Okay, mal anders: würdest du zu einen Arbeitgeber wechseln, der dir dein Gehalt lediglich in einem Try-Block übergibt, dort aber gerne mal Fehler auftreten? ;)

Code:
static void Main() 
{
    int n;
    try 
    {
        // Do not initialize this variable here.
        n = 123;
    }
    catch
    {
    }
    // Error: Use of unassigned local variable 'n'.
    Console.Write(n);
}

Also entweder zuvor initialisieren oder "ref" verwenden statt out.
 
-OK, mit entsprechender Init funktionierts jetzt.

Hab aber schon wieder einen ähnlichen Fehler-diesmal CS0161, nicht in allen Code-Pfaden wird ein Wert zurück gegeben. Soweit ich das sehen kann eigentlich schon.
Sieht von Euch wer,wo da der Hänger ist?
Besten Dank schon im Vorraus!

public string Wertsuchen(int spaltenindex, string pfad, string trennzeichen, string suchwert)
{
try
{
// Sets the file the StreamReader will read from
StreamReader sr = new System.IO.StreamReader(pfad);
string zeile;
List<string> spalte = new List<string>();
bool gefunden=false;

// Read lines . While loop will go through the whole file.
while ((zeile = sr.ReadLine()) != null)
{
// Splits the line at every comma. Places each split into the //string array
string[] lines = Regex.Split(zeile, trennzeichen);
if (lines[0]==suchwert)
{
gefunden=true;
return lines[spaltenindex];
}
else
{
return "";
}
}

if (gefunden==false)
{
return "";
}
}
catch (System.Exception excep)
{
MessageBox.Show(excep.Message);
return "";
}
}
 
ist sau unübersichtlich so wie du das postest...
Abgesehen davon: Wieso fragst du am Schluss nochmal ab ob gefunden == false ist? Wenn ers gefunden hat returned er doch sowieso vorher schon. Schreib statt

if (gefunden==false)
{
return "";
}

einfach

return ""; hin
 
Zuletzt bearbeitet:
-In meinem Script sahs noch übersichtlich aus,
nach einmal copy und paste hierrein sahs dann so aus...

Auf jeden Fall gehts jetzt, weiss zwar nicht genau warum es vorher nicht ging,
aber egal. Merci!
 
@Stephan78: Für die Zukunft: Wenn du Code hier postest, dann kannst du beim erstellen des Posts dein Quellcode in sogenannte Code-Tags packen. Dazu klick einfach in der Leiste über dem Feld ,in welchem du dein Text verfasst, auf die "Raute(#)". Dann werden die Tags eingefügt und du brauchst dein Quellcode nur noch dazwischen einfügen ;) Dann ist das auch wieder so übersichtlich wie in deinem Script.
 
Das gefunden kann man sich sparen .. :)

Code:
public string Wertsuchen(int spaltenindex, string pfad, string trennzeichen, string suchwert)
		{
			try
				{
					// Sets the file the StreamReader will read from
					StreamReader sr = new System.IO.StreamReader(pfad);
					string zeile;
					List<string> spalte = new List<string>();
					
					// Read lines . While loop will go through the whole file.
					while ((zeile = sr.ReadLine()) != null) 
					{
						// Splits the line at every comma. Places each split into the   //string array
						string[] lines = Regex.Split(zeile, trennzeichen);
						return (lines[0]==suchwert) ? lines[spaltenindex] : "";
					}
					
				}	
			catch (System.Exception excep)
				{
					MessageBox.Show(excep.Message);
				}	
			return "";
		}
 
Ich versteh nich ganz warum ihr da überhaupt nen Try-Catch-block macht. Fragt doch einfach vorher ab ob die Datei existiert eh sie mit dem StreamReader geöffnet wird.
 
Sowas MUSS in einen Try-Block, das ist absolute Pflicht für alle IO-Operationen, egal ob Dateisystem oder Netzwerk. Und selbst wenn es ohne try ginge, dann wäre die vorherige manuelle Abfrage keinerlei sicheres Indiz dafür, dass die Datei zum Zeitpunkt des lesends immer noch da ist. Schließlich laufen auf deinem Rechner noch andere Prozesse als nur das eine Programm.
 
Zurück
Oben