Mat*_*ero 12 .net c# generics types interface
我有以下课程:
public class KeyDTO<T>
{
public T Id { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
到目前为止一切顺利,但我希望类型参数T是一个非可空类型.我在某处读过这可能是可行的:
public class KeyDTO<T> where T : IComparable, IComparable<T>
{
public T Id { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我public T Id改为public T? Id,我会收到编译错误,告诉我T必须是不可为空的.
如何指定泛型类型参数必须是非可空的?
我想完成这个,因为我想Id用[Required]属性注释我的属性,如下所示:
public class KeyDTO<T> {
[Required]
public T Id { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
什么[Required]是验证模型,因此T不能为空.
但是,如果我有KeyDTO<int>,Id将被初始化为0,绕过我的[Required]属性
nal*_*lka 36
从 C# 8.0 开始,您现在可以使用where T : notnull泛型约束来T指定不可为空的类型。
Ser*_*rvy 22
应用where T : struct应用作为T非可空值类型的通用约束.由于没有非可空引用类型,因此它具有与"所有非可空类型"完全相同的语义.可空值类型(即Nullable<T>)不满足struct通用约束.