如何避免不相关的可空警告(没有显式抑制)

Mar*_*ker 6 c# nullable c#-8.0

有没有办法让分析器理解变量Bar具有以下情况的值?

#nullable enable 
class Foo {
   bool GenerateArray => Bar.HasValue;
   int? Bar { get; set; }
   void FooBar() {
     var data = (GenerateArray) ? new int[Bar.Value] : null;
   }
}
Run Code Online (Sandbox Code Playgroud)

有警告“可空值类型可能为空”。因为Bar.Value但显然不可能。

我知道有两种方法可以避免警告。两者都有缺点:

  1. Bar.HasValue直接使用而不是属性GenerateArray。但是使用GenerateArray可以提高可读性。
  2. 使用Bar!.Value代替Bar.Value. 但是,如果有人更改了代码,例如,通过GenerateArray在将来创建自动属性,警告可能会再次变得相关,但不会出现。

这里的问题与此问题略有不同,后者使用局部变量而不是属性。如果我理解正确的话,下面接受的答案适用于属性(只要 C# 9 发布),但不适用于局部变量。因此,这个问题不是重复的。

Jul*_*eur 14

将能够MemberNotNullWhen在 C# 9 中使用该属性(目前为预览版):

[MemberNotNullWhen(true, "Bar")]
bool GenerateArray => Bar.HasValue;
Run Code Online (Sandbox Code Playgroud)

.Net 5 中将存在相关的属性类型:

namespace System.Diagnostics.CodeAnalysis
{
    [AttributeUsage(AttributeTargets.Method | AttributeTargets.Property, AllowMultiple = true)]
    public sealed class MemberNotNullAttribute : Attribute
    {
        public MemberNotNullAttribute(params string[] members) { }
        public MemberNotNullAttribute(string member) { }
    }
}

namespace System.Diagnostics.CodeAnalysis
{
    [AttributeUsage(AttributeTargets.Method | AttributeTargets.Property, AllowMultiple = true)]
    public sealed class MemberNotNullWhenAttribute : Attribute
    {
        public MemberNotNullWhenAttribute(bool when, params string[] members) { }
        public MemberNotNullWhenAttribute(bool when, string member) { }
    }
}
Run Code Online (Sandbox Code Playgroud)

在sharplab上的插图