可为空的引用类型意外CS8629可为空的值类型可能为null,且带有临时变量

时间:2019-08-09 15:14:47

标签: c# c#-8.0 nullable-reference-types

在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

1 个答案:

答案 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)