Ulf*_*edt 5 c# generics nullable c#-8.0 nullable-reference-types
在 C#8.0 中使用可空引用类型,给出这个简化的代码,其中 T 可以是任何值类型或引用类型,而空值是引用类型 T 实例的有效值:
public class C<T>
{
public T P { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
编译器发出警告CS8618 "Non-nullable property 'P' is uninitialized. Consider declaring the property as nullable."。我怎样才能满足编译器并消除这个警告(不抑制 CS8618)?
是否有我可以应用的属性或类型参数约束?这种情况怎么办?
我想出的最好的是
public T P { get; set; } = default!;
Run Code Online (Sandbox Code Playgroud)
但我希望有一种方法可以在不使用 null-forgiving/“dammit” 运算符('!')的情况下做到这一点。
注意:您不能将属性的类型声明为T?- CS8627。此外,这意味着返回的任何值类型都是Nullable<T>,这不是预期的。(阅读更多关于这个,例如在这里。)
编辑:我注意到这也有效:
public class C<T>
{
public C()
{
P = default;
}
[AllowNull]
public T P { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
但是,我更愿意使用自动属性初始化程序。
当您实例化类时,属性 P 的值将为 null,这就是您看到警告的原因。
实例化类时需要确保该值不为 null,唯一的方法是定义构造函数并为 提供值P。作为T通用类型,您有两种选择:
T能够创建新实例// Option #1
public class C<T>
{
C(T p)
{
P = p
}
public T P { get; set; }
}
// option #2:
public class C<T> where T : new()
{
C()
{
P = new T()
}
public T P { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
545 次 |
| 最近记录: |