为什么可以使用interface
作为约束为class
的泛型类的类型参数?
interface IB {}
class A<T> where T : class {}
...
A<IB> a; // why is IB allowed here?
引用类型或值类型都可以实现接口,因此您不应该使用接口作为类型参数,因为接口声明不像限制那样“强”。
但是在上面的例子中它没有问题。为什么允许这样做?实现接口的实际对象是否在进程中被装箱(如果它是值类型?
)答案 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参数必须是引用类型;这也适用于任何类,接口,委托或数组类型。