C# 8 不可空引用和隐式使用

C# 8 non nullable references and implicit usage

在 Resharper 和 Rider 中,有 Jetbrains.Annotations 属性可以应用于隐式使用的类型和字段。

例如如果您定义某种数据 contract/DTO,您可以用 [UsedImplicitly] 修饰它,Resharper 将知道不要将此字段标记为未使用。

但是,在 C# 8 中,如果您使用 Nullable Ref Types 功能。 如果您未明确将这些字段设置为非空值,则此类任何不可空字段将被标记为 "Never initialized"。

有什么方法可以告诉 C#8 编译器 "hey, ignore this, just trust me on this one" 吗?

例如 假设我们有这样的请求消息,它可能被传递到 ASP.NET 端点或类似的端点。

class LoginRequest
{
    public string UserName {get; set;}
}

编译器会抱怨 UserName 从未被初始化,这不是因为它是由 Web 客户端初始化的。例如SPA 应用程序。

抑制此类警告的正确方法是什么?

您可以在上下文中使用 #nullable disable

您可以使用标记为非空的 null 值对其进行初始化:

public string UserName { get; set; } = null!;

乍一看这似乎很奇怪,但它是一种非常简单的声明方式,可以声明某些东西在技术上可能 null 短时间,但已知在实际使用时不会。