为什么带有“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
的引用。