Если у меня есть следующий код, у меня нет проблем во время выполнения или компиляции:
if (ConsoleAppBase.NORMAL_EXIT_CODE == code)
{
StdOut.WriteLine(msg);
}
else
{
StdErr.WriteLine(msg);
}
Однако, пытаясь сделать это более кратким, я переключился на следующий код:
(ConsoleAppBase.NORMAL_EXIT_CODE == code
? StdOut
: StdErr
).WriteLine(msg);
Когда у меня есть этот код, я получаю следующее исключение во время выполнения:
System.ObjectDisposedException: невозможно записать в закрытый TextWriter
Можете ли вы объяснить, почему это происходит? Могу ли я избежать этого и получить более краткий код, как я хотел?
Редактировать: упс, извините, я забыл отметить, откуда происходят эти загадочные StdOut
и StdErr
:
/// <summary>
/// Define these so that they can be accessible to unit tests so that
/// a different TextWriter instance can be used for capturing output
/// for verification.
/// </summary>
internal static TextWriter StdOut = Console.Out;
internal static TextWriter StdErr = Console.Error;
Обновление: хм, я только что получил то же исключение с оригинальным, длинным кодом, так что, очевидно, что-то еще не так. Я проверю, что делают мои тесты.
Обновите снова: Оказывается, в моих тестах я перенаправил стандартную ошибку, но не стандартную ошибку, но затем я попытался записать стандартную ошибку, и она вылетела. Мое исправление:
var standardOut = new StreamWriter(Console.OpenStandardOutput())
{
AutoFlush = true
};
Console.SetOut(standardOut);
// Added this:
var standardError = new StreamWriter(Console.OpenStandardError())
{
AutoFlush = true
};
Console.SetError(standardError);
Я отмечаю ответ ChaosPandion как правильный, так как он правильно определил мой тест как шумиху.