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