Подтвердить что ты не робот

Debug.WriteLine() и Console.WriteLine() обрабатывает культуру по-разному. Зачем?

Рассмотрим следующий код приложения консоли:

Thread.CurrentThread.CurrentCulture = new CultureInfo("en-GB");
Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;

DateTime date = new DateTime(2014, 01, 19);

Console.WriteLine("{0}", date); // Prints 19/01/2014
Debug.WriteLine("{0}", date);   // Prints 01/19/2014
Debug.WriteLine(date);          // Prints 19/01/2014

Как отмечено в комментариях, Console.WriteLine() печатает 19/01/2014, а Debug.WriteLine() печатает 01/19/2014.

Еще хуже - Debug.WriteLine("{0}", date) дает отличный результат от Debug.WriteLine(date)...

Ожидается ли, что Debug.WriteLine() игнорирует настройки культуры потока?

Есть ли способ сделать Debug.WriteLine() использовать настройки культуры потока? Или я должен использовать String.Format() и передать результат в Debug.WriteLine()?

(Примечание. Я запускаю это в Windows 8.1 64-bit, en-GB, используя Visual Studio 2013 с .Net 4.51 с отладкой AnyCPU build.)

4b9b3361

Ответ 1

Это явно обрабатывается в источнике.

Это тоже имеет смысл.
Культура конечных пользователей не должна влиять на выход отладки; вы хотите, чтобы ваши журналы отладки были согласованы независимо от того, где выполняется код.

Ответ 2

Перегрузка, которую вы используете явно игнорирует культуру, используя InvariantCulture:

public static void WriteLine(string format, params object[] args) 
{
    TraceInternal.WriteLine(String.Format(CultureInfo.InvariantCulture, format, args));
}

Все другие перегрузки не имеют ничего общего с культурой. Вы можете "обходить" это, используя перегрузку, которая занимает string:

public static void WriteLine(string message, string category)
{
    TraceInternal.WriteLine(message, category);
}

Сделав это:

Thread.CurrentThread.CurrentCulture = new CultureInfo("en-GB");
Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;

DateTime date = new DateTime(2014, 01, 19);

var formatedDate = string.Format("{0}", date);
Console.WriteLine(formatedDate);
Debug.WriteLine(formatedDate);

Теперь оба print:

19/01/2014 00:00:00 
19/01/2014 00:00:00