Ich habe kürzlich eine ASP.Net-Formularanwendung auf .Net 4.5.2 aktualisiert, nachdem ich einige relativ triviale Namespace-Probleme behoben hatte, konnte ich die Lösung erfolgreich erstellen. Zur Laufzeit habe ich jedoch den folgenden Fehler erhalten:
Eine Ausnahme vom Typ 'System.FormatException' ist in mscorlib.dll aufgetreten, wurde aber nicht im Benutzercode behandelt
Welches beim Debuggen durch die folgende Zeile ausgelöst wird:
%Vor%Wobei renderStartTime = DateTime.Now
Ich bin etwas verwirrt, warum ich diesen Fehler seit dem Upgrade sehe. Irgendwelche Gedanken?
Das Problem ist der zweite Doppelpunkt. Sie können stattdessen Folgendes tun:
%Vor%BEARBEITEN
Basierend darauf, wie TimeSpan
in .Net 3.5 und früheren Versionen gearbeitet hat, würde der ursprüngliche Code in .Net 2.0 die Uhrzeit tatsächlich im Format hh: mm: ss ausgeben. Grundsätzlich wurde der "mm: ss" Teil des Formats ignoriert, da TimeSpan
IFormattable
nicht implementiert hat. Das Folgende in .Net 4.5.2 ist also wirklich näher daran, zu ersetzen, was der ursprüngliche Code in .Net 2.0 getan hat.
Wenn Sie jedoch nur Minuten und Sekunden anzeigen möchten, können Sie die Formatierung von {0:mm}:{0:ss}
oder {0:mm\:ss}
in .Net 4.0 und höher verwenden. Oder in .Net 3.5 oder früher müssten Sie es so machen.
Es ist eine brechende Veränderung.
Siehe: Formatieren und Parsen von Zeitintervallen in .NET Framework 4
In .NET Framework 3.5 und früheren Versionen tut TimeSpan dies nicht implementieren
IFormattable
, noch unterstützt es Formatstrings. Daher wird der Formatstring "r" ignoriert und der Parameter ohne Parameter TimeSpan.ToString -Methode wird aufgerufen. In .NET Framework 4, auf der Andererseits wird TimeSpan.ToString (String, IFormatProvider) aufgerufen und hat die nicht unterstützte Formatzeichenfolge übergeben, die die Ausnahme verursacht.
Um die Antwort zu erweitern, würde Ihr ursprünglicher Code in .Net Framework 2.0 keine Ausnahme auslösen, aber Sie erhalten nicht die gewünschte Ausgabe ( Minuten: Sekunden ). Da der Parameter weniger Konstruktor wäre Aufruf für TimeSpan
, ignorieren Sie das Format in String.Format
angegeben. Aber mit .Net Framework 4.0 oder höher, da TimeSpan
implementiert IFormattable
, das angegebene Format mm:ss
würde an den Aufruf ToString
übergeben werden. Nun ist das Format mm:ss
für TimeSpan
ungültig, es erfordert den Doppelpunkt mit einem umgekehrten Schrägstrich wie: mm\:ss
. Deshalb bekommen Sie eine Ausnahme.
Siehe: Custom TimeSpan Format Strings
In .Net 3.5 oder niedriger können Sie verwenden:
%Vor%In .Net Framework 4.0 oder höher können Sie Folgendes tun:
%Vor%Hier benötigen Sie den Code, der so aussieht. Sie können es so machen, wenn Sie möchten
%Vor%Sie können diese Microsoft Dokumentation für weitere Hilfe lesen:
Die benutzerdefinierten TimeSpan-Formatbezeichner enthalten keinen Platzhalter Trennsymbole wie die Symbole, die Tage von Stunden trennen, Stunden von Minuten oder Sekunden von Sekundenbruchteilen. Stattdessen diese Symbole müssen in der benutzerdefinierten Formatzeichenfolge als Zeichenfolge enthalten sein Literale. Zum Beispiel definiert "dd.hh: mm" einen Punkt (.) Als den Trennzeichen zwischen Tagen und Stunden und einem Doppelpunkt (:) als Trennzeichen zwischen Stunden und Minuten. Benutzerdefinierte TimeSpan Formatbezeichner tun dies auch kein Zeichensymbol enthalten, mit dem Sie unterscheiden können negative und positive Zeitintervalle. Um ein Zeichensymbol einzuschließen, du müssen eine Formatzeichenkette konstruieren, indem Sie bedingte Logik verwenden. Das Andere Charaktere Abschnitt enthält ein Beispiel.