提问人:Konrad Viltersten 提问时间:6/25/2023 最后编辑:Konrad Viltersten 更新时间:6/25/2023 访问量:80
该属性可以永远为 null 还是 VS 是错误的?
Can the property be null ever or is VS wrong?
问:
有了下面的类,我保护它免受 null 的影响。Values
public class Container
{
public Guid Id { get; init; }
public virtual IEnumerable<Measure> Measures { get; init; }
public Dictionary<string, Measure[]> Measurement
=> (Measures ?? Array.Empty<Measure>())
.GroupBy(a => a.Type).ToDictionary(a => a.Key, a => a.ToArray());
}
public class Measure
{
public string Name { get; set; }
public string Type { get; set; }
}
出于某种原因,我的 IDE 将合并标记为多余,声称该属性永远不会为 null(即 可以重构为 )。Measures??Array.Empty<Measure>()
Measures
public class Container
{
public Guid Id { get; init; }
public virtual IEnumerable<Measure> Measures { get; init; }
public Dictionary<string, Measure[]> Measurement
=> Measures
.GroupBy(a => a.Type).ToDictionary(a => a.Key, a => a.ToArray());
}
当我听从这个建议时,一位同事指出它是有缺陷的。我同意他的观点,但这是 VS/R# 中的一个错误,这在很大程度上是一个现实的解释。更现实的是:是我们错了。因此,我感觉到我们都遗漏了一些东西,并且IDE在某种程度上是正确的。
不过,我无法解释是怎么回事。
我尝试的是删除、添加和其他一些更改。无论如何,在小提琴中敲击它,如果合并被移除,就会抛出。virtual
= default!
ArgumentNullException
答:
更新日期无论“Nullable”设置如何,我都无法重现 IDE 的消息。
Microsoft Visual Studio Community 2022(64 位)- 当前版本 版本 17.6.0
使用“Nullbale”是“启用”:
1>------ 构建开始:项目:WinFormsApp3,配置:调试任何 CPU ------
1>C:\Users\TMSAdmin\source\WinFormsApp3\WinFormsApp3\Form1.cs(99,23,99,27):警告 CS8618:退出构造函数时,不可为 null 的属性“Name”必须包含非 null 值。请考虑将该属性声明为可为 null。
1>C:\Users\TMSAdmin\source\WinFormsApp3\WinFormsApp3\Form1.cs(100,23,100,27):警告 CS8618:退出构造函数时,不可为 null 的属性“Type”必须包含非 null 值。请考虑将该属性声明为可为 null。
1>C:\Users\TMSAdmin\source\WinFormsApp3\WinFormsApp3\Form1.cs(92,45,92,53):警告 CS8618:退出构造函数时,不可为 null 的属性“度量值”必须包含非 null 值。请考虑将该属性声明为可为 null。
1>WinFormsApp3 -> C:\Users\TMSAdmin\source\WinFormsApp3\WinFormsApp3\bin\Debug\net6.0-windows\WinFormsApp3.dll
1>完成构建项目“WinFormsApp3.csproj”。
========== 构建:1 次成功,0 次失败,0 次最新,0 次跳过 ==========
评论
NRT文件提到:
未追加到类型名称的任何变量都是不可为 null 的引用类型。这包括启用此功能后现有代码中的所有引用类型变量。
?
因此,如果在项目上启用了 nullable,则根据此标准,分析器应假定该标准永远不会为 null。Measures
仅供参考,如果您尚未初始化该属性,您应该会看到 CS8618 警告,但您可以忽略它。如果要避免忽略此警告,可以在项目设置中的“将特定警告视为错误”中添加“可为空”,以报告编译错误。Measures
评论
init
init
set
get
class Container
Measures
null
init
init
null
required
评论
init
init
= default!
= null!
DbSet
IEnumerable<Measure>
IEnumerable<Measure>?
IEnumerable<T>?
{get;}
{get;set;}