Предупреждение VS: одноразовый объект, созданный с помощью 'одноразового', никогда не удаляется, почему?

Я пишу приложение на C # и наткнулся на что-то, из-за чего я не уверен, что это ошибка Visual Studio или мои знания неверны.

Виновником является оператор using внутри части "catch" команды try / catch, где Visual Studio 2019 показывает предупреждение о том, что одноразовый объект не будет удален:

Одноразовый объект, созданный MakeMeSomeDisposableObject (), никогда не удаляется

Тот же оператор, который используется вне перехвата, не показывает предупреждающего сообщения.

Вот пример того, о чем я говорю:

try
{
    SomeMethodThrowingExceptions();
}
catch
{
    using(var someDisposableObject = MakeMeSomeDisposableObjects())
    {
        someDisposableObject.SaveTheWorldFromException();
    }
}

Насколько я понимаю, в случае исключения одноразовый объект спасет мир и будет утилизирован после завершения своей работы из-за оператора using. Однако Visual Studio думает иначе и показывает предупреждающее сообщение, но также не показывает никаких исправлений - это ошибка VS, или я ошибаюсь в том, как операторы using работают в уловке?


person Rachey    schedule 13.09.2019    source источник
comment
Одноразовый объект, созданный MakeMeSomeDisposableObject (), никогда не удаляется. Это предупреждение при нажатии ctrl +.   -  person Rachey    schedule 13.09.2019
comment
@TimSchmelter Тем не менее, часть об использовании внутри улова важна - другие применения этого метода с оператором using не показывают это предупреждение, что заставляет меня неуверенно, что это не просто ошибка IDE.   -  person Rachey    schedule 13.09.2019
comment
и, чтобы быть уверенным, если вы поместите блок using внутри try или за пределами try catch все вместе, то сообщение об ошибке исчезнет?   -  person Casey Crookston    schedule 13.09.2019
comment
@CaseyCrookston Совершенно верно.   -  person Rachey    schedule 13.09.2019
comment
Какая версия Visual Studio?   -  person David Browne - Microsoft    schedule 13.09.2019
comment
VS 2019 Профессиональный, 16.2.4   -  person Rachey    schedule 13.09.2019
comment
Я тоже не получаю этого в VS 2017 (15.9.9).   -  person Casey Crookston    schedule 13.09.2019
comment
Предупреждения анализа кода об использовании IDisposable заведомо ненадежны, они не решают проблему остановки. Нет истории неправильного использования этого конкретного использования, может быть, на самом деле это не так? Anyhoo, просто продолжайте, отключить предупреждение и сообщить об этом Microsoft с помощью справки› Отправить отзыв ›Сообщить о проблеме.   -  person Hans Passant    schedule 13.09.2019
comment
Проверил точный код на заимствованной машине у коллеги - в старой версии VS ничего не отображается. Я просто сообщу об этом в Microsoft и закрою дело.   -  person Rachey    schedule 13.09.2019
comment
Возможно, это потому, что компилятор расширяет используемый блок в фактический блок try/catch; сейчас он прячется MakeMeSomeDisposableObject. Что произойдет, если вы объявите someDisposableObject снаружи, а затем добавите finally блок и избавитесь от него там?   -  person zaggler    schedule 13.09.2019
comment
Я пытаюсь объяснить, что блок catch может фактически выдать ошибку if, что оператор using может дать сбой, поэтому компилятор сообщает вам, что, возможно, MakeMeSomeDisposableObjects не удаляется внутри этого улова, потому что Оператор using создает собственный try / catch и, следовательно, это всего лишь предупреждение ... TBH, вы не должны этого делать, делайте это внутри try и или объявляйте его снаружи ...   -  person zaggler    schedule 13.09.2019
comment
Можете ли вы попробовать это using var someDisposableObject = MakeMeSomeDisposableObjects; someDisposableObject.SaveTheWorldFromException();, оно все еще выдает предупреждение?   -  person zaggler    schedule 13.09.2019
comment
Я сделаю это, но сейчас пятница, когда все горит, и это время года, когда выпускаются релизы, поэтому он попадет в список дел.   -  person Rachey    schedule 13.09.2019