查找 Roslyn 默认可为 null 的上下文

Find Roslyn default nullable context

我们可以使用 Roslyn (Microsoft CodeAnalysis) 来获取 nullability context。但是 NullableContext 结构通常表示可空上下文是从项目默认值继承的。因此,在分析器中,我需要确定项目默认的可空上下文。我还没有想出从编译对象或语义模型来做到这一点的方法。

有什么办法吗?

我可能发布得太早了,因为我在发布后不久就找到了解决方案。答案是,当 NullableContext 设置为 Inherited 时,这是一个标志值,其中未设置启用警告的标志,因此未启用支持 non-nullable 引用类型的上下文(即,我们有旧样式代码) .所以,至少我不需要弄清楚项目默认值是什么。

更一般地说,可以按如下方式测试标志:

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);
    }

另一方面,大家可能还想知道项目的默认值,所以如果有人发布实现它的代码,我会把它标记为正确答案。

如果你想要项目默认,你可以从Compilation.Options.NullableContextOption获取。

但是正如您在回答中正确观察到的那样,询问语义模型会为您计算有效值。