非可空类型的通用约束

时间:2014-12-15 17:05:01

标签: c# .net generics types interface

我有以下课程:

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]属性

2 个答案:

答案 0 :(得分:21)

从C#8.0开始,您现在可以使用where T : notnull泛型约束来指定T是不可为空的类型。

答案 1 :(得分:16)

应用where T : struct会应用T为非可空值类型的通用约束。由于没有非可空引用类型,因此它具有与“所有非可空类型”完全相同的语义。可空值类型(即Nullable<T>)不满足struct通用约束。