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但显然不可能。
我知道有两种方法可以避免警告。两者都有缺点:
Bar.HasValue直接使用而不是属性GenerateArray。但是使用GenerateArray可以提高可读性。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)
| 归档时间: |
|
| 查看次数: |
393 次 |
| 最近记录: |