2014-12-02 26 views
8

Niedawno zaktualizowałem aplikację formularzy ASP.Net do .Net 4.5.2, po naprawieniu pewnych względnie banalnych problemów z przestrzeniami nazw mogłem zbudować rozwiązanie z powodzeniem. Jednak w czasie wykonywania I otrzymywały następujący błąd:Wyjątek String.Format po aktualizacji z .Net 2.0 do .Net 4.5.2

An exception of type 'System.FormatException' occurred in mscorlib.dll but was not handled in user code

Które podczas debugowania jest wyrzucane przez następujący wiersz:

string.Format("Init took {0:mm:ss}", (object) DateTime.Now.Subtract(renderStartTime)) 

Gdzie renderStartTime = DateTime.Now

Jestem nieco zdziwiony dlaczego Widzę ten błąd od czasu aktualizacji. jakieś pomysły?

+0

usunąć oddanych do obiektu. –

+3

ustalono, że @HighCore jest niepotrzebnym rzutem, jednak wyjątek jest nadal rzucany bez niego – Matt

+3

jak pokazano w odpowiedziach [tutaj] (http://stackoverflow.com/questions/574881/how-can-can-format-a- timespan-object-with-a-custom-format-in-net) nastąpiła przełomowa zmiana z formatowaniem TimeSpans z .NET 3.5 na .NET 4.0 – Jonesopolis

Odpowiedz

3

Problem polega na drugim dwukropku. Można wykonać następujące czynności zamiast

string.Format("Init took {0:mm}:{0:ss}", DateTime.Now.Subtract(renderStartTime)); 

EDIT

oparciu o jak TimeSpan pracował w .NET 3.5 i wcześniej oryginalny kod w .NET 2.0 faktycznie wydrukować czas w formacie hh: mm: Format ss. Zasadniczo część "mm: ss" tego formatu została zignorowana, ponieważ TimeSpan nie implementowała IFormattable. Tak więc poniższe w .Net 4.5.2 jest naprawdę bliżej zastąpienia tego, co oryginalny kod robił w .Net 2.0.

string.Format("Init took {0}", DateTime.Now.Subtract(renderStartTime)); 

Ale jeśli chcesz pokazać tylko minuty i sekundy można użyć formatowania obu {0:mm}:{0:ss} lub {0:mm\\:ss} w .NET 4.0 i wyższej. Lub w .Net 3.5 lub wcześniejszym musiałbyś to zrobić w ten sposób.

TimeSpan diff = DateTime.Now.Subtract(renderStartTime); 
string.Format("Init took {0:00}:{1:00}", diff.Minutes, diff.Seconds); 
+0

To nie zwróci oczekiwanej wartości w .Net 2.0. Dla architektury 4.0 lub nowszej nawet ten 'string.Format (" Init took {0: mm \\: ss} ", DateTime.Now.Subtract (renderStartTime));' wystarczy, ale to nie działałoby w .Net 3.5 i poniżej :) – Habib

+0

@Habib prawda i ja oryginalny kod w 2.0 nie wracał tylko kilka minut i sekund. – juharr

3
Console.WriteLine(string.Format("Init took {0:mm\\:ss}", DateTime.Now.Subtract(renderStartTime))); 

Tutaj potrzebny jest kod wyglądać this.You może zrobić to w ten sposób, jeśli chcesz

Console.WriteLine(string.Format(@"Init took {0:mm\:ss}", DateTime.Now.Subtract(renderStartTime))); 

może czytasz ten microsoft documentation aby uzyskać pomoc:

The custom TimeSpan format specifiers do not include placeholder separator symbols, such as the symbols that separate days from hours, hours from minutes, or seconds from fractional seconds. Instead, these symbols must be included in the custom format string as string literals. For example, "dd.hh:mm" defines a period (.) as the separator between days and hours, and a colon (:) as the separator between hours and minutes. Custom TimeSpan format specifiers also do not include a sign symbol that enables you to differentiate between negative and positive time intervals. To include a sign symbol, you have to construct a format string by using conditional logic. The Other Characters section includes an example.

6

To przełomowa zmiana.

Patrz: Formatting and Parsing Time Intervals in the .NET Framework 4

In the .NET Framework 3.5 and earlier versions, TimeSpan does not implement IFormattable , nor does it support format strings. Therefore, the “r” format string is ignored, and the parameterless TimeSpan.ToString method is called. In the .NET Framework 4, on the other hand, TimeSpan.ToString(String, IFormatProvider) is called and passed the unsupported format string, which causes the exception.

Wystarczy rozwinąć na odpowiedź, oryginalny kod w .NET Framework 2.0 nie wyjątek, ale to nie daje pożądany wynik, (minuty: sekundy). Ponieważ parametrem less constructor byłoby wywołanie TimeSpan, ignorując format określony w String.Format. Ale, z .Net framework 4.0 lub hgiher, ponieważ TimeSpan implementuje IFormattable, format określony mm:ss zostanie przekazany do połączenia ToString. Teraz ten format mm:ss jest nieprawidłowy dla TimeSpan, wymaga dwukropka, aby można było go uciec z tylnym ukośnikiem, takim jak: mm\:ss. Właśnie dlatego dostajesz wyjątek.

Patrz: Custom TimeSpan Format Strings

w .NET 3.5 lub obniżyć można użyć:

TimeSpan elapsed = DateTime.Now - renderStartTime; //or DateTime.Now.Subtract(renderStartTime) 
string formatted = string.Format("Init took {0}:{1}", elapsed.Minutes, elapsed.Seconds); //returns minutes and seconds components, 
             // If you are looking for Total Minutes and Total Seconds then use TotalMinutes/TotalSeconds 

w .NET Framework 4.0 lub wyższy można zrobić:

string.Format("Init took {0:mm\\:ss}", elapsed); 
Powiązane problemy