Анализируйте обнуляемость внутри анонимных типов с Roslyn - PullRequest
0 голосов
/ 24 марта 2020

Вот фрагмент кода, который я хочу проанализировать с помощью Roslyn:

object Method()
{
  var rnd = new Random();
  return new { First = "1", Second = rnd.NextDouble() > 0.5 ? "2" : null };
}

Я хотел бы выяснить обнуляемость возвращаемых свойств. Я знаю, как найти ReturnStatementSyntax и SemanticModel.

. Моя проблема в том, что C# не создает аннулируемых аннотаций для анонимных типов. Приведенный выше анонимный тип - { First: string, Second: string }, без аннотаций.

Насколько я понимаю, для анонимных типов компилятор использует обнуляемость, основанную только на анализе потока данных (поправьте меня, если я ошибаюсь). При наведении курсора Second VS правильно указывает, что в этом месте он может иметь значение string?.

Используя Roslyn (Microsoft.CodeAnalysis), как я могу извлечь информацию о том, что возвращенное свойство First не является обнуляемый и Second обнуляемый?

1 Ответ

0 голосов
/ 10 апреля 2020

В конце концов получается, что все работает так, как вы и ожидаете.

Меня долго обмануло ограничение Рослина: выражения LINQ теряют аннотации обнуляемости (по состоянию на апрель 2020 года), и это был мой контрольный пример: (

...