为什么Generic <t>方法带有&#34;其中T:class&#34;约束接受接口

时间:2015-11-15 13:44:40

标签: c# generics interface constraints

我有interface

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

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

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

和这个电话:

Test<ITestInterface>();

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

为什么会这样?

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

class

其中public partial class TestServiceClient: System.ServiceModel.ClientBase<TestNamespace.ITestService>, TestNamespace.ITestService 有这个定义:

ClientBase<T>

1 个答案:

答案 0 :(得分:9)

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

来自C#语言规范:

  

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

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

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

IComparable i = 0;

现在i存储对已加框0的引用。