【问题标题】:How to tell the compiler that it's ok to have an uninitialized non nullable property如何告诉编译器可以拥有未初始化的非可空属性
【发布时间】:2023-01-17 01:00:08
【问题描述】:

我在我的旧项目中启用了可空引用类型,我对这个概念还很陌生。

我有这样的数据模型:

 public class AddClientInput
    {
        public string Code { get; set; }
        public string Name{ get; set; }
    }

此编译器显示此警告消息:

警告 CS8618 不可为空的属性“名称”在退出构造函数时必须包含非空值。

在打字稿中,我可以通过添加“null forgiving operator”来抑制警告

 class AddClientInput
    {
       Code!: string;
       Name!: string;
    }

我怎样才能在 C# 中做类似的事情(不初始化变量)?

【问题讨论】:

标签: c#


【解决方案1】:

尝试

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

【讨论】:

  • 可为空的引用类型 - 如果您希望字符串可为空,则它需要为 string?
  • 那不是我理解这个问题的方式。它应该是不可空的并禁止显示警告。这就是解决方案。
  • “我在我的旧项目中启用了可空引用类型”第 1 行
  • “如何告诉编译器可以拥有未初始化的不可空属性”:-)
  • 很好,那么您的类型必须在您的答案中声明为 string? 才有意义。但是您不能将不可为 null 的字符串初始化为 null。
【解决方案2】:

你已经告诉编译器这个属性将绝不为空。那么你必须初始化它。在这种情况下,我通常使用空字符串作为字符串类型。

public string Code { get; set; } = string.Empty;

如果您希望字符串可以为空,则必须这样声明它

public string? Code { get; set; } // Compiler wont complain now

【讨论】:

    【解决方案3】:

    您可以通过添加 ? 使属性可为空

    Public string? Code { get; set; }
    

    另一方面,你可以

    Public string Code { get; set; } = default;
    

    如果您不想这样做,您可以通过从csproj 文件中删除以下行或将其设置为禁用来禁用它。默认值为禁用。

    <Nullable>enable</Nullable>
    

    【讨论】:

      【解决方案4】:

      这取决于您想要实现的行为。我会不推荐这样做:

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

      在这里我们说“这个属性不应该有空值”,同时我们说“嘿编译器,我知道那个代码有问题(我们不必为属性提供值Code当我们创建该类型的实例时),但请闭上眼睛”。

      更好的方法是使用位置语法记录:

      public record AddClientInput(string Code, string Name);
      

      或者如果它是一个无法转换为记录的类,那么构造函数:

      public record AddClientInput
      {
          public string Code{ get; set; }
          public string Name{ get; set; }
      
          public AddClientInput(string code, string name)
          {
              Code = name;
              Name = email;
          }
      }
      

      或者required在c#11中引入的关键字:

      public class AddClientInput
      {
          public required string Code { get; set; }
          public required string Name{ get; set; }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-07-18
        • 1970-01-01
        • 1970-01-01
        • 2012-02-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多