我有以下课程:
public class KeyDTO<T>
{
public T Id { get; set; }
}
到目前为止一切顺利,但我希望类型参数 T 为非可空类型。 我在某处读过这可能是可行的:
public class KeyDTO<T> where T : IComparable, IComparable<T>
{
public T Id { get; set; }
}
但是,如果我将public T Id
更改为public T? Id
,则会收到编译错误,告诉我T
必须是不可为空的。
如何指定泛型类型参数必须是不可为空的?
我想完成此操作,因为我想使用Id
属性注释我的[Required]
属性,如下所示:
public class KeyDTO<T> {
[Required]
public T Id { get; set; }
}
[Required]
的作用是验证模型,因此T
不能为空。
但是,如果我有KeyDTO<int>
,Id
将被初始化为0
,绕过我的[Required]
属性
答案 0 :(得分:21)
从C#8.0开始,您现在可以使用where T : notnull
泛型约束来指定T是不可为空的类型。
答案 1 :(得分:16)
应用where T : struct
会应用T
为非可空值类型的通用约束。由于没有非可空引用类型,因此它具有与“所有非可空类型”完全相同的语义。可空值类型(即Nullable<T>
)不满足struct
通用约束。