Console.Clear () останавливает выполнение метода (исключение IOException не достигается) - PullRequest
0 голосов
/ 23 января 2019

У меня очень странное поведение из-за этого метода:

    public T NavigateTo<T>() where T : Page
    {
        SetPage<T>();

        Console.Clear();
        CurrentPage.Display();

        return CurrentPage as T;
    }

От: https://github.com/uta-org/EasyConsole/blob/master/EasyConsole/Program.cs#L106

Проблема в том, что когда достигается Console.Clear(), я продолжаю выполнять (нажимая F10) область видимости просто выходит из метода.

...

Как видите, как только я нажимаю F10 (перешагнуть), консоль снова отображается (это означает, что выполнение точки останова завершено).

Почему это происходит? И что возвращает этот метод? Потому что я ожидал NullReferenceException:

    public MainPage(Program program)
        : base("Main Page", program,
      new Option("Fork Syncing (complete process)", () => program.NavigateTo<ForkSyncing>().DoLinking = null),
      new Option("Fork Syncing (only cloning)", () => program.NavigateTo<ForkSyncing>().DoLinking = true),
      new Option("Fork Syncing (only linking)", () => program.NavigateTo<ForkSyncing>().DoLinking = false),
      new Option("Exit", () => Environment.Exit(0)))
    {
    }

От: https://github.com/uta-org/QuickFork/blob/eaf8f0a65af75e74015a1a1e168d98ad65d9e472/QuickFork.Shell/MainPage.cs#L21

Я делаю это по запросу автора в README. И как вы видите, я устанавливаю свойство DoLinking, и это не Nullable. (У меня ошибка в том, что DoLinking не подписан, поэтому мой рабочий процесс не выполняется должным образом).

Я испытываю это при сборке Debug и Release. Я на .NET 4.6.1.

EDIT:

Я не осознавал исключение Intelisense IOException. Но я включил переключение этого исключения в окне настроек исключений:

...

И код, предложенный ответом @timms:

...

Но это более странно, даже если выбрасывается любое исключение.

Ответы [ 2 ]

0 голосов
/ 29 января 2019

Несмотря на два полученных мной отрицательных голоса, я все еще верю (и люди, как я понимаю, не понимают этого), это ошибка (поэтому я создал проблему на dotnet/roslyn repo).

Итак, чтобы решить эту проблему, я изменил переменную DoLinking с ForkSyncing класса на статический.

И затем я сделал следующее:

AddPage(new MainPage(this,
            new Option("Fork Syncing (complete process)", () =>
            {
                ForkSyncing.DoLinking = null;
                NavigateTo<ForkSyncing>();
            }),
            new Option("Fork Syncing (only cloning)", () =>
            {
                ForkSyncing.DoLinking = true;
                NavigateTo<ForkSyncing>();
            }),
            new Option("Fork Syncing (only linking)", () =>
            {
                ForkSyncing.DoLinking = false;
                NavigateTo<ForkSyncing>();
            }),
            new Option("Exit", () => Environment.Exit(0))));

Итак, если я установлю его до того, как позвоню NavigateTo<T>(), у меня не возникнет этой проблемы.

0 голосов
/ 23 января 2019

Существуют определенные сценарии, при которых console.clear генерирует IOException.

Держу пари, что Console.Clear выбрасывает IOException, который не пойман. Официальное руководство для Console.Clear (https://docs.microsoft.com/en-us/dotnet/api/system.console.clear?view=netframework-4.7.2)) заключается в том, что вы должны деформировать его использование в блоке try / catch.

public T NavigateTo<T>() where T : Page
{
    SetPage<T>();

    try{
      Console.Clear();
    }catch(IOException ex){
      //do something
    }
    CurrentPage.Display();

    return CurrentPage as T;
}
...