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