为什么带有"where T:class"约束的Generic <T>方法接受接口

Ami*_*ich 12 c# generics interface constraints

我有这个interface:

public interface ITestInterface
{
    int TestInt { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

和这个通用方法(带T : class约束):

public void Test<T>() where T : class
{
    // DoSomething
}
Run Code Online (Sandbox Code Playgroud)

这个电话:

Test<ITestInterface>();
Run Code Online (Sandbox Code Playgroud)

一切编译和运行的同时,interface 是不是一个class(是吗?).

为什么会这样?

我第一次看到我的WCF代理类:

public partial class TestServiceClient:
     System.ServiceModel.ClientBase<TestNamespace.ITestService>, TestNamespace.ITestService
Run Code Online (Sandbox Code Playgroud)

ClientBase<T>这个定义在哪里:

public abstract class ClientBase<TChannel> : 
     ICommunicationObject, IDisposable where TChannel : class
Run Code Online (Sandbox Code Playgroud)

Jak*_*rtz 9

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

从C#语言规范:

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

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

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

IComparable i = 0;
Run Code Online (Sandbox Code Playgroud)

现在i存储对盒装的引用0.