Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.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# 退出构造函数时,非nullable属性必须包含非null值。考虑将属性声明为可空的_C#_Visual Studio - Fatal编程技术网

C# 退出构造函数时,非nullable属性必须包含非null值。考虑将属性声明为可空的

C# 退出构造函数时,非nullable属性必须包含非null值。考虑将属性声明为可空的,c#,visual-studio,C#,Visual Studio,我有一个像这样的简单课程 public class Greeting { public string From { get; set; } public string To { get; set; } public string Message { get; set; } } 奇怪的是,我得到了以下警告 Severity Code Description Project File Line Suppression State Warning C

我有一个像这样的简单课程

public class Greeting
{
    public string From { get; set; }
    public string To { get; set; } 
    public string Message { get; set; }
}
奇怪的是,我得到了以下警告

Severity    Code    Description Project File    Line    Suppression State
Warning CS8618  Non-nullable property 'From' must contain a non-null value when exiting constructor. 
Consider declaring the property as nullable.    MxWork.Elsa2Wf.Tuts.BasicActivities  
D:\work\MxWork\Elsa2.0WfLearning\MxWork.Elsa2.0Wf.Tuts\src 
\MxWork.Elsa2Wf.Tuts.BasicActivities\Messages\Greeting.cs   5   Active
我很困惑。这些新的信息让我信心扫地。 我从这三家酒店都买了。 这一点突然出现了

有人能建议如何缓解这种情况吗


编译器警告您,字符串属性的默认赋值(null)与其声明的类型(非null
string
)不匹配

这是在打开时发出的,这会将所有引用类型更改为非空,除非使用
另有说明

例如,您的代码可以更改为

public class Greeting
{
    public string? From { get; set; }
    public string? To { get; set; } 
    public string? Message { get; set; }
}
要将属性声明为可为null的字符串,或者可以在行中或构造函数中为属性提供默认值:

public class Greeting
{
    public string From { get; set; } = "default from";
    public string To { get; set; } = "default to";
    public string Message { get; set; } = "default message";
}

如果希望将属性的类型保留为非null。

启用可为null的引用类型将在运行应用程序时为您省去很多麻烦。大量警告的问题在于,大多数警告可能不会导致问题,但它可能会隐藏导致难以发现的错误的警告

像Slate和其他人指出的问题和回答得很好的问题一样,使用它也有一些缺陷

这是一个非常好的主意,有尽可能接近零的警告

启用nullable后,会产生大量警告。很多时候,编译器只知道某些内容可能为null。但是,如果您比编译器更聪明,您就知道当它到达该代码时,它不会为空

例如:

    public partial class Exams: ComponentBase
    {
    [Inject] private IQuestionPoolFetchService? QPoolService { get; init; }


        private async Task FetchQuestionPool()
        {
            await QPoolService.GetAllQuestionsFromText();
        }
这将抛出CS8602警告。因为也许DI会发送一个空值。当然,我们知道这不会发生

你可以用#prama这样的方式摆脱警告:

    public partial class Exams: ComponentBase
    {
    [Inject] private IQuestionPoolFetchService? QPoolService { get; init; }


        private async Task FetchQuestionPool()
        {
#pragma warning disables CS8602 // Dereference of a possibly null reference.
            await QPoolService.GetAllQuestionsFromText();
#pragma warning restore CS8602 // Dereference of a possibly null reference.
        }
这是一段非常难看的代码,如果您必须重复多次,它会变得最糟糕

更好的解决方案: 使用空原谅运算符。“!”


这会告诉编译器,嘿,我知道这可能是空的,但不会是空的。

您已经启用了。如果您没有预料到这一点,并且您不确定如何使用它们,那么最好关闭它们(直到您有机会了解最新情况),这正是为了提高您对代码的信心而发出的警告。没有它,很容易得到空引用错误。不可空字符串的合理默认值通常是
string.Empty
public partial class Exams: ComponentBase
{
[Inject] private IQuestionPoolFetchService? QPoolService { get; init; }


    private async Task FetchQuestionPool()
    {
        await QPoolService!.GetAllQuestionsFromText();
        // null-forgiving ^
    }