2014-12-02 2 views
8

Недавно я обновил приложение форм ASP.Net для .NET 3.5.2, исправив некоторые относительно тривиальные проблемы с пространством имен, мне удалось построить решение успешно. Однако во время выполнения я получаю следующее сообщение об ошибке:Исключение String.Format после обновления с .Net 2.0 до .Net 4.5.2

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

Что при отладке брошено следующей строкой:

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

Где renderStartTime = DateTime.Now

Я несколько озадачен, почему Я вижу эту ошибку с момента обновления. Есть предположения?

+0

удалить литая объекта. –

+3

согласился с @HighCore - это ненужный листинг, однако исключение все равно бросается без него – Matt

+3

, как показано в ответах [здесь] (http://stackoverflow.com/questions/574881/how-can-i-string-format-a- timespan-object-with-a-custom-format-in-net) произошел сбой с форматированием TimeSpans от .NET 3.5 до .NET 4.0 – Jonesopolis

ответ

3

Проблема в том, что вторая толстая кишка. Вы можете сделать следующее вместо

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

EDIT

Основываясь на том, как TimeSpan работал в .NET 3.5 и более ранних версий исходный код в .NET 2.0 фактически распечатать времени в формате чч: мм: ss. В основном часть формата «mm: ss» была проигнорирована, поскольку TimeSpan не реализовал IFormattable. Итак, следующее в .Net 4.5.2 действительно ближе к замене исходного кода на .Net 2.0.

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

Но если вы хотите, чтобы показывать только минуты и секунды вы можете использовать форматирование либо {0:mm}:{0:ss} или {0:mm\\:ss} в .Net 4.0 и выше. Или в .Net 3.5 или раньше вам придется делать это вот так.

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

Это не вернет ожидаемое значение в .Net 2.0. Для фреймворка 4.0 или выше даже этот 'string.Format (« Init принял {0: mm \\: ss} », DateTime.Now.Subtract (renderStartTime));' достаточно, но это не сработает в .Net 3.5 и ниже :) – Habib

+0

@Habib true и я оригинальный код в 2.0 не возвращался всего за несколько минут и секунд. – juharr

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

Здесь нужен код, чтобы выглядеть как this.You может сделать это так, если вы хотите

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

Вы можете прочитать эту майкрософт documentation для получения дополнительной помощи:

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

Это разрушительное изменение.

См: 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.

Просто расширить ответ, ваш исходный код в рамках .Net 2.0 будет не сгенерирует исключение, но это не даст вам желаемый результат, (минут: секунд). Поскольку конструктор с меньшим значением будет вызывать TimeSpan, игнорируя формат, указанный в String.Format. Но, с .Net framework 4.0 или hgiher, поскольку TimeSpan реализует IFormattable, указанный формат mm:ss будет передан на вызов ToString. Теперь этот формат mm:ss недействителен для TimeSpan, для этого требуется, чтобы двоеточие было экранировано с обратной косой чертой, например: mm\:ss. Вот почему вы получаете исключение.

См: Custom TimeSpan Format Strings

В .Net 3.5 или понизить вы можете использовать:

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 

В .NET Framework 4.0 или выше вы можете сделать:

string.Format("Init took {0:mm\\:ss}", elapsed); 
Смежные вопросы