Мы можем использовать Roslyn (Microsoft CodeAnalysis), чтобы получить контекст допустимости значений NULL. Но структура NullableContext часто указывает, что контекст, допускающий значение NULL, унаследован от проекта по умолчанию. Таким образом, в анализаторе мне нужно определить контекст проекта по умолчанию, допускающий значение NULL. Я не нашел способа сделать это из объекта компиляции или семантической модели.

Есть ли способ сделать это?

3
mbabramo 18 Авг 2020 в 04:08

2 ответа

Лучший ответ

Если вам нужен проект по умолчанию, вы можете получить его из Compilation.Options.NullableContextOption.

Но, как вы правильно заметили в своем ответе, запрос семантической модели вычисляет для вас эффективное значение.

0
Jason Malinowski 19 Авг 2020 в 19:10

Возможно, я опубликовал это преждевременно, так как нашел решение вскоре после публикации. Ответ заключается в том, что когда для NullableContext установлено значение Inherited, это значение флагов, в котором флаг для включенных предупреждений не установлен, поэтому контекст, поддерживающий ссылочные типы, не допускающие значения NULL, не включен (то есть у нас есть код старого стиля). Так что, по крайней мере, мне не нужно выяснять, что такое проект по умолчанию.

В более общем плане можно проверить флаги следующим образом:

public static class NullableContextExtensions
    {
        private static bool IsFlagSet(NullableContext context, NullableContext flag) =>
            (context & flag) == flag;

        public static bool WarningsEnabled(this NullableContext context) =>
            IsFlagSet(context, NullableContext.WarningsEnabled);

        public static bool AnnotationsEnabled(this NullableContext context) =>
            IsFlagSet(context, NullableContext.AnnotationsEnabled);
    }

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

1
mbabramo 18 Авг 2020 в 02:02