Почему TryParse в синтаксисе С# 7 (параметр "пустой" ) выдает предупреждение, если вы его скомпилируете?

В С# 7 вам разрешено делать

            if (int.TryParse("123", out int result)) 
                Console.WriteLine($"Parsed: {result}");

или - если вы не используете результат и просто хотите проверить, успешно ли выполняется анализ, отбросьте значение out:

           if (int.TryParse("123", out _))
                Console.WriteLine("Syntax OK");                

Это обычно работает нормально, но в Visual Studio 2017 второй пример, где параметр out пуст, генерирует предупреждение

Предупреждение AD0001: Анализатор "Microsoft.CodeAnalysis.CSharp.Diagnostics.SimplifyTypeNames.CSharpSimplifyTypeNamesDiagnosticAnalyzer" вызвал исключение типа "System.NullReferenceException" с сообщением "Ссылка на объект не установлена для экземпляра объекта.".

Версии Visual Studio, где я мог убедиться, что это происходит,

Выпуск Visual Studio Enterprise 2017 версии 15.1 (26403.7)
Выпуск Visual Studio Enterprise 2017 версии 15.2 (26430.4)

Это ошибка, или использование int.TryParse("123", out _) официально не поддерживается? Я не мог найти подсказки до сих пор.


Для полноты вот код консольного приложения, показывающего проблему:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            if (int.TryParse("123", out _))
                Console.WriteLine("Syntax OK");
        }
    }
}

Ответы

Ответ 1

Я отправил запрос команды (запроС# 19180) команде разработчиков, и они подтвердили, что это ошибка. Здесь вы можете увидеть весь статус в GitHub dotnet/roslyn.

Пильчи прокомментировал 16 часов назад
Я могу воспроизвести это в 15.2, но не 15.3. Перейдем к компилятору на основе стека, > Abut. Я уверен, что это обман. @jcouv?

jcouv прокомментировал (а) 16 часов назад
Да, это дубликат (№ 17229 и, возможно, еще один). Это было исправлено в dev15.3 (# 17544), и мы, к сожалению, не смогли вытащить исправление в dev15.2. Спасибо @Matt11 за то, что вы зарегистрировали проблему и извините за ошибку.

Кажется, что он уже исправлен и будет, насколько я понял, доступным в следующем обновлении. Но нет объявленной даты, когда он будет включен Microsoft, поэтому я представил проблему через "Отправить отзыв/Сообщить о проблеме" в Visual Studio 2017.

Примечания:

  • Проблема не ограничивается TryParse. Я подтвердил, что это также происходит, если вы пишете свою собственную функцию, то есть следующий пример показывает предупреждение AD0001:

    static void Main(string[] args)
    {   
            bool myOutDemo(string str, out int result)
            {
                    result = (str??"").Length;
                    return result > 0;
            }
            // discard out parameter
            if (myOutDemo("123", out _)) Console.WriteLine("String not empty"); 
    }
    
  • Я заметил, что теперь доступен предварительный просмотр VS Version 15.3, который должен содержать исправление, упомянутое в комментариях GitHub. Ознакомьтесь со следующей ссылкой: Visual Studio 2017 Версия 15.3 Предварительный просмотр. После его установки я снова проверил проблему и могу подтвердить, что она там исправлена.


Спасибо всем, кто участвовал в обсуждении выше! (вопросы)