C#推断构造期间通过Ref参数指定的成员的可空性
我有一些在Xamarin应用程序中设置属性值的速记:C#推断构造期间通过Ref参数指定的成员的可空性,c#,ref,nullable-reference-types,C#,Ref,Nullable Reference Types,我有一些在Xamarin应用程序中设置属性值的速记: protected bool SetProperty(ref T storage,T value,[CallerMemberName]string propertyName=null) { if(Object.Equals(存储,值)) 返回false; 储存=价值; OnPropertyChanged(propertyName); 返回true; } 这在我的ViewModels中使用,例如: 类PersonViewModel:ViewM
protected bool SetProperty(ref T storage,T value,[CallerMemberName]string propertyName=null)
{
if(Object.Equals(存储,值))
返回false;
储存=价值;
OnPropertyChanged(propertyName);
返回true;
}
这在我的ViewModels中使用,例如:
类PersonViewModel:ViewModel
{
私有字符串名称;
公共字符串名
{
get=>name;
set=>SetProperty(参考名称、值);
}
公共PersonViewModel(字符串名称){
名称=名称;
}
}
当我有#nullable enable
时,我如何(在一般情况下,每当使用SetProperty
时)帮助编译器推断name
成员在构造后不是null
目前,我在构造函数上收到一条警告,上面写着:
“CS8618:非空属性‘名称’在退出构造函数时必须包含非空值。请考虑将该属性声明为可空的。”
我在我的.csproj
中使用了最新的
,我想您需要使用来表示“如果值
不为空,则存储
不为空”
看
而不是正常设置属性,因为编译器不知道这两者是同一件事
编辑:我刚刚注意到,在.NET 5.0中,他们添加了,因此您的构造函数可以保持如下状态:
public PersonViewModel(string theName)
{
Name = theName;
}
您只需使用以下属性标记setter:
public string Name
{
get => name;
[MemberNotNull(nameof(name))]
set => SetProperty(ref name, value);
}
如前所述,编译器不知道Name
和Name
是如何连接的,因此您应该在Name
setter中准确设置Name
属性。但这并不能消除警告,但您可以使用空原谅运算符代码>,请参阅samlpe代码:
public class Cls
{
public Cls(string n)
{
SetValue(ref name!, n);
}
private string name;
public string Name
{
get => name;
set => SetValue(ref name, value);
}
private void SetValue<T>(ref T store, T value) => store = value;
}
公共类Cls
{
公共Cls(字符串n)
{
设置值(参考名称!,n);
}
私有字符串名称;
公共字符串名
{
get=>name;
set=>SetValue(参考名称、值);
}
私有无效设置值(参考T存储,T值)=>存储=值;
}
您从何处获得警告?
public string Name
{
get => name;
[MemberNotNull(nameof(name))]
set => SetProperty(ref name, value);
}
public class Cls
{
public Cls(string n)
{
SetValue(ref name!, n);
}
private string name;
public string Name
{
get => name;
set => SetValue(ref name, value);
}
private void SetValue<T>(ref T store, T value) => store = value;
}