gpt4 book ai didi

c# - 如何让 C# 意识到方便属性的可空性?

转载 作者:行者123 更新时间:2023-12-04 14:05:36 25 4
gpt4 key购买 nike

考虑这个代码片段,它没有可为 null 的警告。

public class Foo {
public string Property { get; } = "Some String";
}

public class Bar {
[DisallowNull]
public Foo? Foo { get; private set; }

[MemberNotNull(nameof(Foo))]
public void MyMethod() {
Foo = new Foo();

// After setting Foo, I use Foo.Property in some way
Console.WriteLine(Foo.Property);
}
}

因为在我的真实代码中,我在设置Foo 很多之后使用Foo.Property,我想添加一个“方便的属性”到 Bar 直接返回它,这样我就可以用一个更短的名字访问它(Foo 在我的真实代码中实际上是一个相当长的名字):

// in Bar
public string? Property => Foo?.Property;

// ...
// Now I can do:
Console.WriteLine(Property);

但是,现在 Bar.Property 是可以为 null 的,即使在 Foo 绝对不为 null 的地方(比如刚设置完 Foo ).所以当我在不允许 null 的地方使用 Property 时,编译器会给我警告。

我以为我需要的是用NotNullIfMemberNotNull(nameof(Foo))之类的东西来注释Property,但是在查找之后,this attribute is only proposed, and doesn't exist yet .

我该如何解决这个问题?

最佳答案

我想出的一个解决方法是让 FooProperty 都有支持字段。在Foo 的setter 中,还设置了Property。这样,我们就可以将 MemberNotNull 属性添加到 Foo 的 setter 中。

private Foo? foo;

[DisallowNull]
public Foo? Foo {
get => foo;
[MemberNotNull(nameof(Property))]
private set {
foo = value;
Property = value.Property;
}
}

public string? Property { get; private set; }

但是,这不是很普遍。它之所以有效,是因为 Foo 恰好被标记为 DisallowNull

关于c# - 如何让 C# 意识到方便属性的可空性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68619723/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com