gpt4 book ai didi

C# 在构造期间通过 Ref 参数推断分配的成员的可空性

转载 作者:行者123 更新时间:2023-12-03 18:53:38 24 4
gpt4 key购买 nike

我有一些在 Xamarin 应用程序中设置属性值的简写:

protected bool SetProperty<T>(ref T storage, T value, [CallerMemberName] string propertyName = null)
{
if (Object.Equals(storage, value))
return false;
storage = value;
OnPropertyChanged(propertyName);
return true;
}
这在我的 ViewModels 中使用,例如:
class PersonViewModel : ViewModel
{
private string name;
public string Name
{
get => name;
set => SetProperty(ref name, value);
}
public PersonViewModel(string theName) {
Name = theName;
}
}
当我有 #nullable enable ,我如何(在一般情况下,每当使用 SetProperty 时)帮助编译器推断 name构造后成员不为空?
目前,我在构造函数上收到警告,其中说:
“CS8618:退出构造函数时,不可为空的属性‘名称’必须包含非空值。考虑将该属性声明为可为空的。”。
我正在使用 <LangVersion>latest</LangVersion>在我的 .csproj .

最佳答案

我认为你需要使用 NotNullIfNotNull 说“如果 storage 不为空,value 不为空”。
SharpLab

protected bool SetProperty<T>(
[NotNullIfNotNull("value")] ref T storage,
T value,
[CallerMemberName] string? propertyName = null)
{
if (object.Equals(storage, value))
return false;
storage = value;
OnPropertyChanged(propertyName);
return true;
}
在构造函数中,您需要执行以下操作:
SetProperty(ref name, theName);
而不是正常设置属性,因为编译器不知道这两个是一回事。
编辑:我刚刚注意到在 .NET 5.0 中,他们添加了 MemberNotNull ,所以你的构造函数可以保持这样:
public PersonViewModel(string theName)
{
Name = theName;
}
你只需要用属性标记 setter:
public string Name
{
get => name;
[MemberNotNull(nameof(name))]
set => SetProperty(ref name, value);
}

关于C# 在构造期间通过 Ref 参数推断分配的成员的可空性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66382937/

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