使用接口作为泛型类的类型参数,在C#中限制为“class”

时间:2016-04-16 12:20:47

标签: c# generics interface

为什么可以使用interface作为约束为class的泛型类的类型参数?

interface IB {}
class A<T> where T : class {}
...
A<IB> a; // why is IB allowed here?

引用类型或值类型都可以实现接口,因此您不应该使用接口作为类型参数,因为接口声明不像限制那样“强”。

但是在上面的例子中它没有问题。为什么允许这样做?实现接口的实际对象是否在进程中被装箱(如果它是值类型?

3 个答案:

答案 0 :(得分:3)

作为接口类型键入的任何变量都是引用类型,如果实现类型是值类型,它将被装箱,例如。

IConvertible c = 3;

会在分配给3时将值c设为框。

如果您有通用类型A<T>T是接口类型,则T内对A的任何引用也将是引用类型,因此{{1约束满足。

答案 1 :(得分:2)

查看docs

  

其中T:class

     

type参数必须是引用类型;这也适用于任何类,接口,委托或数组类型。

您可能正在寻找的是 new() -constraint:

  

其中T:new()

     

type参数必须具有公共无参数构造函数。与其他约束一起使用时,必须最后指定new()约束。

如果你使用

class A<B> where B : new()

然后IB不能用作参数:

  

错误CS0310'IB'必须是具有公共无参数构造函数的非抽象类型,以便在泛型类型或方法'A'

中将其用作参数'T'

答案 2 :(得分:0)

我可以建议你阅读MSDN documentation。它声明class的约束:

  

type参数必须是引用类型;这也适用于任何类,接口,委托或数组类型。