c# - 可空引用类型意外 CS8629 可空值类型可能为空且带有临时变量

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

在 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/

相关文章:

c# - 为什么我可以声明一个与父作用域中的变量同名的子变量?

c# - 如何使用 .NET 反射检查可为空的引用类型

c# - 如何纠正错误运算符 '&&' 无法应用于类型 'bool?' 和 'bool' 的操作数

c# - 为什么 IAsyncEnumerator 在 C#8 中没有 Reset 方法?

c# - 帮助进行 Shannon-Fano 编码

c# - 避免对具有可为空类型/字段的泛型发出警告的最佳方法?

asp.net-core - 如何在 aspnetcore razor View 页面 (.cshtml) 中启用#nullable

c# - 是否可以根据另一个属性通知 C# 编译器另一个属性将是非空的?

c# - 如何使用 WndProc 捕获 ESC 按键?

c# - SQL 添加字符串作为参数