为什么Generic<;T>;方法中使用“;其中T:类“;约束接受接口

本文关键字:其中 接口 约束 lt Generic gt 方法 为什么 | 更新日期: 2023-09-27 18:22:08

我有这个interface:

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

以及这种通用方法(具有T : class约束):

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

这个电话:

Test<ITestInterface>();

并且当interface不是class(或者它是?)时,所有内容都编译并运行。

为什么会发生这种情况?

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

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

其中ClientBase<T>具有以下定义:

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

为什么Generic<;T>;方法中使用“;其中T:类“;约束接受接口

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

来自C#语言规范:

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

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

值类型也可以实现接口,但将值类型强制转换为接口会导致值被装箱

IComparable i = 0;

现在CCD_ 7存储对装箱的CCD_ 8的引用。