我有一个像这样的简单类。
public class Greeting
{
public string From { get; set; }
public string To { get; set; }
public string Message { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
奇怪的是,我收到以下警告。
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
Run Code Online (Sandbox Code Playgroud)
我很困惑。它抛出的这些新信息打击了我的信心。我从所有三个属性中得到它们。而这突然出现了。
有人可以建议如何减轻这种情况。
viv*_*una 195
如果您不想这样做,可以通过从 csproj 文件中删除以下行或将其设置为disable. 默认值为disable。
<Nullable>enable</Nullable>
Run Code Online (Sandbox Code Playgroud)
这是官方文档。
Yor*_*oro 65
自C#11 (.NET 7.0 ) 开始,您可以添加required修饰符。
public class Greeting
{
public required string From { get; set; }
public required string To { get; set; }
public required string Message { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
此功能旨在改进我们初始化不依赖构造函数参数的对象的方式,这样就不会感觉像作弊。
但是使用required修饰符,您将无法使用它var greeting = new Greeting();来创建对象实例。现在创建一个对象实例必须执行以下操作:
var greeting = new Greeting()
{
"Me",
"You",
"Some msg..",
};
Run Code Online (Sandbox Code Playgroud)
最初的答案发布于: What is best way to create .NET6 class with many non-nullable property?
更详细的信息: https ://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/required
小智 54
您可以直接将属性注释为不可为空。
public string Property{ get; set; } = null!;
Run Code Online (Sandbox Code Playgroud)
Property如果用户尝试将其设置为,它会发出警告null
Zac*_*ott 19
对于使用可为空引用类型的实体框架:
public class NullableReferenceTypesContext : DbContext {
public DbSet<Customer> Customers => Set<Customer>();
public DbSet<Order> Orders => Set<Order>();
}
Run Code Online (Sandbox Code Playgroud)
小智 18
You can also implement a constructor to remove the error.
public class Greeting
{
public string From { get; set; }
public string To { get; set; }
public string Message { get; set; }
public Greeting(string from, string to, string message)
{
From = from;
To = to;
Message = message;
}
}
Run Code Online (Sandbox Code Playgroud)
Dar*_*ner 15
在运行应用程序时,启用可空引用类型将为您省去很多麻烦。大量警告的问题在于,大多数警告可能不会引起问题,但它可能隐藏了导致难以发现的错误的警告。
使用它有一些问题,比如 Slate 和其他人指出的问题并回答得很好。
尽可能接近零警告是一个非常好的主意。
启用 nullable 后,它会产生很多警告。很多时候编译器只是知道某些东西可能为空。但是,您比编译器更聪明,您知道当它到达该代码时它不会为空。
例如:
public partial class Exams: ComponentBase
{
[Inject] private IQuestionPoolFetchService? QPoolService { get; init; }
private async Task FetchQuestionPool()
{
await QPoolService.GetAllQuestionsFromText();
}
Run Code Online (Sandbox Code Playgroud)
这将引发 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.
}
Run Code Online (Sandbox Code Playgroud)
这是非常丑陋的代码,如果您必须重复多次,它会变得更糟。
更好的解决方案: 使用 null-forgiving 运算符。“!”
public partial class Exams: ComponentBase
{
[Inject] private IQuestionPoolFetchService? QPoolService { get; init; }
private async Task FetchQuestionPool()
{
await QPoolService!.GetAllQuestionsFromText();
// null-forgiving ^
}
Run Code Online (Sandbox Code Playgroud)
这告诉编译器嘿,我知道这可能为空,但它不会。
roh*_*095 10
单击项目名称 -> 打开 .csproj 文件
Replace <Nullable>enable</Nullable>
With <Nullable>disable</Nullable>
Run Code Online (Sandbox Code Playgroud)
编译器警告您,您的字符串属性的默认分配(空值)与其声明的类型(非空值)不匹配string。
当打开可为空的引用类型时会发出此消息,这会将所有引用类型更改为非空,除非使用?.
例如,您的代码可以更改为
public class Greeting
{
public string? From { get; set; }
public string? To { get; set; }
public string? Message { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
将属性声明为可为空的字符串,或者您可以在线或在构造函数中提供属性默认值:
public class Greeting
{
public string From { get; set; } = "default from";
public string To { get; set; } = "default to";
public string Message { get; set; } = "default message";
}
Run Code Online (Sandbox Code Playgroud)
如果您希望将属性的类型保留为非空。
在 Visual Studio 2022 v17.2.3 Visual Studio 项目设置中
右键单击您的项目标题 > 属性 > 应用程序 > 打包 > 在“构建”部分下 > 在下拉列表中设置“Nullable”=“启用”。
| 归档时间: |
|
| 查看次数: |
1090 次 |
| 最近记录: |