在C#8项目中,我使用的是可为空的引用类型,并且收到了意外的(或者至少对我而言是意外的)CS8629警告,
IEnumerable<Cars> GetAvailableCars(Vendor carVendor, string? someAdditionalInfo);
我已经决定使用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
不能为null
请注意,singleContent
的类型为x.DataInt
。
答案 0 :(得分:4)
这只是一个临时性的答案,直到可空引用类型的设计者之一朱利安·库弗勒(Julien Couvreur)发表了明确的答案(na)。我将其发布在这里,因为一旦发布C#8,就会再次询问该问题。
Julien在3个Github问题#34800,#37032和#36149中回答时,这是C#8分析器的已知限制,超出了C#8的范围。
这需要别名分析(仅在此处猜测),意味着分析器将能够分析别名表达式,即其结果“隐藏”在临时变量(可能也是参数?)之后的表达式。
在.NET Conf 2019期间发布.NET Core 3时,也许我们可以在线询问他或Mads Torgersen的发布日期(完全不na)