为什么带有“where T:class”约束的Generic 方法接受接口

我有这个interface

 public interface ITestInterface { int TestInt { get; set; } } 

和这个generics方法(带有T : class约束):

 public void Test() where T : class { // DoSomething } 

这个电话:

 Test(); 

interface 不是一个class (或者它是什么?)时,一切都编译并运行。

为什么会这样?

我第一次在我的WCF代理类上看到这个:

 public partial class TestServiceClient: System.ServiceModel.ClientBase, TestNamespace.ITestService 

ClientBase具有此定义:

 public abstract class ClientBase : ICommunicationObject, IDisposable where TChannel : class 

class约束意味着类型必须是引用类型,不一定是类。

从C#语言规范:

引用类型约束指定用于type参数的类型参数必须是引用类型。 已知为引用类型(如下定义)的所有类类型,接口类型,委托类型,数组类型和类型参数都满足此约束。

基本上,这意味着类型不能是值类型。

值类型也可以实现接口,但是将值类型转换为接口会导致值被加框

 IComparable i = 0; 

现在i存储了一个盒装0的引用。