ich hoffe ich habe bei der Suche nichts übersehen, deshalb hier meine Frage:
Ich benutze das untenstehende Codefragment um bestimmte Dateiendungen von einer Operation auszuschließen. Komischerweise interessiert das switch-case die Dateiendung gar nicht! Beim debuggen springt der Aufrufzeiger immer direkt ins default. Hab ich irgendwas übersehen?
FileInfo fi = new FileInfo(_attachmentName);
var test = fi.Extension;
switch (test)
{
case ".7z":
case ".zip":
case ".rar":
case ".gzip":
break;
default:
CompressAttachment(_compressName, _attachmentName);
break;
}
blöde frage, hast du noch in nem übergeordneten scope(klassenfeld oder so)
ne variable namens test? weit her geholt aber eigentlich sollte dein code funktionieren....
Der Code aus dem Startpost funktioniert ohne Probleme.
Wenn du ToLower() schon versucht hast, warum hast du diese (wohl zum funktionieren essentielle Zeile) wieder gelöscht?
der einzige Fehler ist dass du höchstwahrscheinlich im Release Mode bist und "Optimize Code" eingestellt hast. Oder du hast dies im Debug Mode explizit gesetzt.
Dabei wird deine switch oder if wegoptimiert, da sie einfach keinen Sinn macht. Um der Optimierung temporär zu umgehen schreib mal folgendes, dann siehst du super dass der Code richtig funktioniert und er in den richtigen switch/if Fall reingeht:
switch (test)
{
case ".gzip":
case ".rar":
case ".zip":
case ".7z":
Debugger.Break();
break;
default:
Debugger.Break();
break;
}
So wird der case Block auch im "Optimize Code" ausgeführt.
@Florian Reischl,
deins funktioniert mit der "Optimize Code" an auch nicht, anderfalls schon.
@Lumbra
Naja, es würde funktionieren, aber der Code macht NIX, desswegen wird er wegoptimiert. Wenn du in den Statements etwas Code rein machst wird auch nichts wegoptimiert.
Kick die Option aber nicht im RELEASE mode weg, sondern nur wenn sie im DEBUG aktiviert ist.
Gruß
Michael
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von xxMUROxx am .
Ja aber return und break zwei verschiendene Arten eine switch zu beenden. Währen das eine aus der Methode zurückkehrt, bricht die eine nur die switch ab.
Desswegen die Frage, was willst du mit dem Code erreichen. Auf jeden Fall macht er NIX.
@xxMUROxx: Das sehe ich aber anders, mein Code macht durchaus etwas, allerdings nur im DEFAULT...
Mit den Cases vorher wollte ich eigentlich "nur" einen Abbruch des Switchs erreichen
Bei mir sieht es jetzt so aus:
FileInfo fi = new FileInfo(_attachmentName);
var test = fi.Extension.ToLower();
switch (test)
{
case ".7z":
case ".zip":
case ".rar":
case ".gzip":
return;
default:
attachment.SaveAsFile(_attachmentName);
CompressAttachment(_compressName, _attachmentName);
_attachmentIndex = attachment.Index;
_mailItem.Attachments.Remove(_attachmentIndex);
_mailItem.Attachments.Add(_compressName, Type.Missing, Type.Missing, Type.Missing);
return;
}
Gruß,
Michael
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Lumbra am .
das was du da machen willst ist nicht wirklich für ein switch geeignet.
Es wird zwar funktionieren ist aber nicht wirklich sinnvoll.
Du kannst das auch einfach mit einer if Anweisung machen.
So z.B.
var extensions = new string[]{".txt", ".png", ".jpg"};
if(!extensions.Contains(fi.Extension.ToLower()))
{
//das wäre dann das selbe wie dein Default im Switch
}
so in der Art hab ich es jetzt gemacht, wobei Contains() bei strings nicht funktioniert - also habe ich eine List<string> genommen, damit gehts dann wieder...
rollerfreak2, wobei zu erwähnen ist, dass Dein Beispiel nicht "korrekt" ist. Es hätte unangenehme Nebeneffekte. Daher sollte hier auf eine Liste zurück gegriffen werden.
Siehe Beispiel von michlG.
Abgesehen von anderen, besser funktionierenden, Lösungen stellt sich natürlich immer noch die Frage, warum switch/case nicht funktionieren sollte.
Leider ist Lumbra bisher die Antwort auf die Frage nach dem Inhalt von Extension im default-Zweig schuldig geblieben. Außerdem könnte durch Logging festgestellt werden, ob es einfach nur ein scheinbares Fehlverhalten z. B. aufgrund von Optimierungen war.