为什么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
class
约束意味着类型必须是引用类型,而不一定是类。
来自C#语言规范:
引用类型约束指定用于类型参数的类型参数必须是引用类型。所有已知为引用类型的类类型、接口类型、委托类型、数组类型和类型参数(如下所定义)都满足此约束。
基本上,这意味着类型不能是值类型。
值类型也可以实现接口,但将值类型强制转换为接口会导致值被装箱
IComparable i = 0;
现在CCD_ 7存储对装箱的CCD_ 8的引用。