小编Joh*_*lle的帖子

我可以告诉C#可为空的引用方法实际上是对字段的空检查吗

考虑以下代码:

#nullable enable
class Foo
{
    public string? Name { get; set; }
    public bool HasName => Name != null;
    public void NameToUpperCase()
    {
        if (HasName)
        {
            Name = Name.ToUpper();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在Name = Name.ToUpper()上,我收到一条警告,指出Name是可能的空引用,这显然是错误的。我可以通过内联HasName来解决此警告,因此条件是if(Name!= null)。

有什么方法可以指示编译器,HasName的真实响应暗含对Name的不可为空性的约束?

这很重要,因为HasName实际上可能会测试更多的东西,并且我可能想在多个地方使用它,或者它可能是API表面的公共部分。有很多原因希望将空检查纳入其自己的方法中,但是这样做似乎破坏了可空引用检查器。

c# nullable-reference-types

11
推荐指数
1
解决办法
360
查看次数

如何暗示C#8.0可为空的参考系统使用反射来初始化属性

当我尝试将Entity Framework Core与C#8.0中的新可为空的引用类型一起使用时,遇到了一个有趣的问题。

实体框架(各种样式)允许我声明我从未初始化过的DBSet属性。例如:

    public class ApplicationDbContext : IdentityDbContext
      {
    #pragma warning disable nullable
        public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
          : base(options)
        { }
    #pragma warning restore nullable

        public DbSet<Probe> Probes { get; set; }
        public DbSet<ProbeUnitTest> ProbeUnitTests { get; set; }
    }
Run Code Online (Sandbox Code Playgroud)

DbContext构造函数反映类型并初始化所有DbSet属性,因此我知道,根据构造函数的结论,所有属性都将不为空。如果我省略#pragma,则会收到预期的警告,因为我的代码未初始化这些属性。

 Data\ApplicationDbContext.cs(10,12,10,32): warning CS8618: Non-nullable property 'Probes' is uninitialized.
 Data\ApplicationDbContext.cs(10,12,10,32): warning CS8618: Non-nullable property 'ProbeUnitTests' is uninitialized.
Run Code Online (Sandbox Code Playgroud)

当我只想通知编译器某个属性不会为null时,关闭警告似乎是一种钝器。

如果事实证明,我可以像这样愚弄编译器:

 Data\ApplicationDbContext.cs(10,12,10,32): warning CS8618: Non-nullable property 'Probes' is uninitialized.
 Data\ApplicationDbContext.cs(10,12,10,32): warning CS8618: Non-nullable property 'ProbeUnitTests' is uninitialized.
Run Code Online (Sandbox Code Playgroud)

该代码的优点是范围很窄-仅适用于特定属性的初始化,不会抑制其他警告。缺点是这是胡扯的代码,因为为其本身分配属性实际上不应该执行任何操作。

是否有首选的惯用法通知编译器它只是不知道该属性已被初始化?

c# entity-framework entity-framework-core c#-8.0 nullable-reference-types

9
推荐指数
2
解决办法
420
查看次数