给定此简化代码,在C#8.0中使用可空引用类型,其中T可以是任何值类型或引用类型,而空值是引用类型T实例的有效值:
public class C<T>
{
public T P { get; set; }
}
编译器发出警告CS8618 "Non-nullable property 'P' is uninitialized. Consider declaring the property as nullable."
。我如何才能满足编译器的要求并静音此警告(不抑制CS8618)?
是否存在我可以应用的属性或类型参数约束?在这种情况下如何?
我想出的最好的是
public T P { get; set; } = default!;
但是我希望找到一种方法,而无需使用“ dammit operator”('!')。
注:您不能将属性的类型声明为T?
-CS8627。此外,这意味着返回的任何值类型都是Nullable<T>
,这不是预期的。
编辑:我注意到这也有效:
public class C<T>
{
public C()
{
P = default;
}
[AllowNull]
public T P { get; set; }
}
但是我更喜欢使用自动属性初始化器。
实例化类时,属性P的值为空,这就是您看到警告的原因。
实例化类时,需要确保值不为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; }
}