Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#推断构造期间通过Ref参数指定的成员的可空性_C#_Ref_Nullable Reference Types - Fatal编程技术网

C#推断构造期间通过Ref参数指定的成员的可空性

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

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

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;
}