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)
该class约束意味着,类型必须是引用类型,不一定是类.
从C#语言规范:
引用类型约束指定用于type参数的类型参数必须是引用类型.已知为引用类型(如下定义)的所有类类型,接口类型,委托类型,数组类型和类型参数都满足此约束.
基本上,这意味着类型不能是值类型.
值类型也可以实现接口,但是将值类型转换为接口会导致值被加框
IComparable i = 0;
Run Code Online (Sandbox Code Playgroud)
现在i存储对盒装的引用0.