Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何避免不相关的可为空警告(无显式抑制)_C#_Nullable_C# 8.0 - Fatal编程技术网

C# 如何避免不相关的可为空警告(无显式抑制)

C# 如何避免不相关的可为空警告(无显式抑制),c#,nullable,c#-8.0,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; } } 对于Bar.value,会出现警告“可为null的值类型可能为null”,但

是否有办法使分析仪了解变量
Bar
在以下情况下具有值

#nullable enable 
class Foo {
   bool GenerateArray => Bar.HasValue;
   int? Bar { get; set; }
   void FooBar() {
     var data = (GenerateArray) ? new int[Bar.Value] : null;
   }
}
对于
Bar.value
,会出现警告“可为null的值类型可能为null”,但显然不能为空

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

  • 直接使用
    Bar.HasValue
    而不是属性
    generatarray
    。但是,使用
    generatarray
    可以提高可读性
  • 使用
    Bar!。值
    而不是条。值。但是,如果有人更改代码,例如,将来将
    GenerateArray
    设置为自动属性,则警告可能再次变得相关,但不会出现

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

    在我发现的mahesh#b评论中的链接之后,我指出,遗憾的是,没有其他方法可以避免C#8.0中的警告。

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

    相关属性类型将存在于.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) { }
        }
    }
    

    “但显然不可能。”你确定吗?它是线程安全的吗?如果我直接使用Bar.HasValue而不是属性GenerateArray,警告就会消失,但在线程安全方面没有任何改变。因此,我将忽略这一方面。您确定它提高了可读性吗?对我来说不是。它又增加了一个我必须跳过的环,以查看代码实际在做什么。使用Bar.HasValue对我来说似乎更清楚。我很好奇为什么你认为
    if(Bar.HasValue)
    会影响可读性。如果说有什么区别的话,它更明确,任何人都会第一眼就知道发生了什么。我遗漏了什么吗?你检查过了吗?
    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) { }
        }
    }