我想知道如何正确处理VS2022中的警告.net 6.0项目.我在一个单独的方法中完成了类的初始化,即不直接在构造函数中完成.但我收到一条警告:退出构造函数时,不可为null的字段"Name"必须包含非null值.考虑将该字段声明为可空.

我不希望Name字段为null,换句话说,这个类的实例应该始终有Name的值.并且Init()方法从两个构造函数中调用并设置此值.如果有帮助,警告号码是CS8618.

对此,似乎有多种解决方案,但消除此警告的正确方法是什么?我希望避免代码中出现#pragma ignore警告丑陋,因此我认为这对我来说不是一个有效的解决方案.

class ClassA {
  public string Name;

  public ClassA(int i) { 
    Init(i.ToString());
  }
  public ClassA(string s) {
    Init(s);
  }
  private void Init(string id) {
     Name = id;
     //lots of other stuff happening in this method
  } 
}

推荐答案

只要可能,就不应忽略可空性警告.在这种情况下,您可以使用MemberNotNullAttribute来帮助编译器:

指定方法或属性将确保列出的字段和属性成员的值不是null.

public class ClassA
{
    public string Name;

    public ClassA(int i)
    {
        Init(i.ToString());
    }

    public ClassA(string s)
    {
        Init(s);
    }

    [MemberNotNull(nameof(Name))]
    private void Init(string id)
    {
        Name = id;
    }
}

有关其他有用的nullability分析属性,请参见this doc.

或者使用注释中@Panagiotis Kanavos建议的方法-使用构造函数链接:

public class ClassA
{
    public string Name;

    public ClassA(int i) : this(i.ToString())
    {
    }

    public ClassA(string s)
    {
        Name = s;
    }
}

还请注意,通常建议将字段封装到属性中.

Csharp相关问答推荐

try 使用Microsoft Curve通过外部c#应用程序将Azure AD B2C用户分配到组- . PostAsynock错误CS1061

将C#字符串转换为其UTF8编码字符的十六进制表示

当打印一行x个项目时,如何打印最后一行项目?

Blazor:类型或命名空间名称Components在命名空间中不存在''

如何创建ASP.NET Core主机并在同一进程中运行请求

LINQ无法翻译SQLFunctions方法

为什么这个Reflection. Emit代码会导致一个DDL ViolationException?

FileStream. FlushAsync()是否确保文件被写入磁盘?

将XPS转换为PDF C#

REST API端点中异步后台代码执行的类型

可为空的泛型属性

C#EF Core 8.0表现与预期不符

Int和uint相乘得到LONG?

如何更改新创建的实例的变量?

如何在.NET MAUI中最大化GraphicsView的大小?

错误:此版本的Visual Studio无法打开以下项目

使用Blazor WebAssembly提高初始页面加载时间的性能

如何在C#控制台应用程序中获取用户输入并将其作为订单项目进行处理?

从HTML元素获取 colored颜色

游戏对象走向不同的方向