String.Format-Ausnahme nach dem Upgrade von .Net 2.0 auf .Net 4.5.2

8

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?

    
Matt 02.12.2014, 16:31
quelle

3 Antworten

3

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.

%Vor%

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.

%Vor%     
juharr 02.12.2014, 16:41
quelle
6

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%     
Habib 02.12.2014 16:43
quelle
3
%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.

    
mybirthname 02.12.2014 16:41
quelle

Tags und Links