【发布时间】:2019-12-17 08:47:02
【问题描述】:
在一个 C# 8 项目中,我正在使用可为空的引用类型,并且收到了一个意外的(或至少对我来说是意外的)CS8629 警告,
bool singleContent = x.DataInt != null;
bool multiContent = x.DataNvarchar != null;
if (singleContent && multiContent)
{
throw new ArgumentException("Expected data to either associate a single content node or " +
"multiple content nodes, but both are associated.");
}
if (singleContent)
{
var copy = x.DataInt.Value; // CS8629 here
newPropertyData.DataNvarchar = $"umb://{type.UdiType}/{Nodes[copy].UniqueId.ToString("N")}";
}
我决定使用GetValueOrDefault() 作为解决方法,但我想知道如何向编译器证明如果检查了singleContent,x.DataInt 不能为空。
注意x.DataInt的类型是int?。
【问题讨论】:
-
这里“正确”的解决方法是使用该死的操作符 --
x.DataInt!.Value -
@canton7 所以我明白了。我怎么会错过一个叫做该死的操作员的东西……该死的。我想今天早上我的大脑不太好。
-
这是分析的已知限制。这在github.com/dotnet/roslyn/issues/34800(引入 tmp 变量时的可空警告)中进行了讨论
-
@JulienCouvreur 这不是完全相同的问题,但我认为它会属于相同的响应,它需要更深入的分析支持并且超出了 C# 8 的范围。
-
@LasseVågsætherKarlsen Julien 是可空类型的设计者之一。所以无论问题的措辞是否匹配,他最有资格为这个问题写一个好的答案(nag nag)
标签: c# c#-8.0 nullable-reference-types