在 C# 8 项目中,我正在使用可为 null 的引用类型并收到意外(或者至少对我来说是意外的)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()
作为解决方法,但我想知道如何向编译器证明 x.DataInt
不能如果选中 singleContent
,则为 null。
注意x.DataInt
的类型是int?
。
最佳答案
这只是一个临时答案,直到可空引用类型的设计者之一 Julien Couvreur 发布了确定的答案(唠叨)。我将其发布在这里是因为一旦 C# 8 发布,该问题将再次被提出。
正如 Julien 在 3 个 Github 问题中的回答 #34800 , #37032和 #36149这是 C# 8 分析器的一个已知限制,它超出了 C# 8 的范围。
这需要别名分析(这里只是猜测)意味着分析器将能够分析别名表达式,即结果“隐藏”在临时变量(也可能是参数?)后面的表达式。
也许我们可以在线询问他或 Mads Torgersen 何时在 .NET Conf 2019 期间发布 .NET Core 3关于发布日期(完全不是唠叨)
关于c# - 可空引用类型意外 CS8629 可空值类型可能为空且带有临时变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57432944/