有没有办法让分析器理解变量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
但显然不可能。
我知道有两种方法可以避免出现警告。两者都有缺点:
- Using
Bar.HasValue
直接代替属性GenerateArray
。然而使用GenerateArray
提高可读性。
- Using
Bar!.Value
代替Bar.Value
。但是,如果有人更改代码,例如,通过GenerateArray
将来的自动属性时,该警告可能会再次相关,但不会出现。
这里的问题与这个问题,其中使用局部变量而不是属性。如果我理解正确的话,下面接受的答案适用于该属性(一旦 C# 9 发布),但不适用于局部变量。因此,这个问题不是重复的。
将能够使用MemberNotNullWhen
C# 9 中的属性(当前处于预览状态):
[MemberNotNullWhen(true, "Bar")]
bool GenerateArray => Bar.HasValue;
.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) { }
}
}
Sharplab 上的插图
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)