猿问

可空引用类型意外 CS8629 可空值类型对于临时变量可能为空

在 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


请注意, 的类型x.DataInt是int?。


MMTTMM
浏览 102回答 0
0回答

肥皂起泡泡

这只是一个临时答案,直到可为空引用类型的设计者之一 Julien Couvreur 发布明确的答案(唠叨)。我在这里发布这个问题是因为一旦 C# 8 发布,这个问题将会再次被问到。正如 Julien 在 3 个 Github 问题#34800、#37032和#36149中的回答,这是 C# 8 分析器的一个已知限制,超出了 C# 8 的范围。这需要别名分析(这里只是猜测)意味着分析器将能够分析别名表达式,即其结果“隐藏”在临时变量(也可能是参数?)后面的表达式。也许我们可以在.NET Conf 2019期间向他或 Mads Torgersen 在线询问 .NET Core 3 的发布日期(完全不用唠叨)
随时随地看视频慕课网APP
我要回答