Мы можем использовать Roslyn (Microsoft CodeAnalysis), чтобы получить контекст допустимости значений NULL. Но структура NullableContext
часто указывает, что контекст, допускающий значение NULL, унаследован от проекта по умолчанию. Таким образом, в анализаторе мне нужно определить контекст проекта по умолчанию, допускающий значение NULL. Я не нашел способа сделать это из объекта компиляции или семантической модели.
Есть ли способ сделать это?
2 ответа
Если вам нужен проект по умолчанию, вы можете получить его из Compilation.Options.NullableContextOption.
Но, как вы правильно заметили в своем ответе, запрос семантической модели вычисляет для вас эффективное значение.
Возможно, я опубликовал это преждевременно, так как нашел решение вскоре после публикации. Ответ заключается в том, что когда для 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);
}
С другой стороны, кто-то все еще может захотеть узнать значение проекта по умолчанию, поэтому, если кто-то опубликует код для этого, я отмечу его как правильный ответ.
Похожие вопросы
Новые вопросы
c#
C # (произносится как «резкий») - это высокоуровневый, статически типизированный язык программирования с несколькими парадигмами, разработанный Microsoft. Код C # обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, включая, среди прочего, .NET Framework, .NET Core и Xamarin. Используйте этот тег для вопросов о коде, написанном на C # или в формальной спецификации C #.