c# - 为什么 C# 不对不可为空的长字段发出警告?

标签 c# .net

为什么在构造函数中未设置 FieldTwo 时,我没有收到不可为空的警告(或其他一些警告)?我使用的是 .Net 5.0,并且在项目文件中将 Nullable 选项设置为 true。

  public class MyClass
  {
    public string FieldOne;
    public long FieldTwo;

    public MyClass (string p1, long p2)
    {
      FieldOne = p1;
      // FieldTwo is not set. Where is the non-nullable warning!?
    }
  }

最佳答案

long 是值类型,不能为 null。所以没有理由对 null 发出警告。我怀疑你想要的是一个字段未初始化警告。

如果从未分配私有(private)字段,则会导致 CS0649 警告。但是,如果字段 public,或在类中的任何位置被修改,则不会引发此警告。例如,以下代码是完全可以接受的,并且不应发出警告:

public class MyClass{
    private long myLong;
    public void Increment() => myLong++;
}

如果该字段只能从构造函数中设置,则应将其声明为只读。但是,公共(public)只读字段不会触发警告,即使它们可能应该触发。请参阅Why do I NOT get warnings about uninitialized readonly fields? .

关于c# - 为什么 C# 不对不可为空的长字段发出警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69190532/

相关文章:

c# - 无法从 'method group' 转换为 'Func<string, string, bool>'

c# - 基于数据库中的另一个字段自动增加 id

.net - 谁能告诉我 Umbraco 中的基本图标是什么意思?

c# - 增加/减少 SemaphoreSlim 中可用插槽的数量

c# - InvalidOperationException : Multiple handlers matched. 以下处理程序匹配路由数据并满足所有约束:

c# - Windows 商店应用程序中的密码散列

c# - 有没有办法在 C# 中打印计算的时间格式字符串?

.net - 创建 CLR 存储过程时出现语法错误

c# - 以下语句中的 `this` 和 `base` 有什么区别?

c# - 如何使用 C# 下载具有正确编码的 HTML 页面?