C#generics能有一个特定的基types吗?
generics接口的types是否可能基于特定的父类?
例如:
public interface IGenericFace<T : BaseClass> { }
显然,上面的代码不起作用,但如果是这样,我想告诉编译器是T
必须是BaseClass
的子类。 可以这样做,有计划吗?
我认为这对于一个特定的项目是有用的,在编译时确保一个通用的接口/类不用于非预期的types。 或者也可以对自我文档进行sorting:显示打算使用哪种types的文档。
public interface IGenericFace<T> where T : SomeBaseClass
你所指的是所谓的“通用约束”。 有许多限制可以放在generics上。
一些基本的例子如下:
-
where T: struct
– types参数必须是值types。 可以指定除Nullable
之外的任何值types。 有关更多信息,请参阅使用可空types(C#编程指南) 。 -
where T : class
– types参数必须是引用types; 这也适用于任何类,接口,委托或数组types。 -
where T : new()
– types参数必须具有公共无参数构造函数。 与其他约束一起使用时,必须最后指定new()
约束。 -
where T : <base class name>
– types参数必须是或从指定的基类派生。 -
where T : <interface name>
– types参数必须是或实现指定的接口。 可以指定多个接口约束。 约束接口也可以是通用的。 -
where T : U
– 为T
提供的types参数必须是来自为U
提供的参数。 这被称为裸types约束。
这些也可以像这样链接在一起:
C#
public class TestClass<T> where T : MyBaseClass, INotifyPropertyChanged, new() { } public interface IGenericFace<T> where T : SomeBaseClass
VB
Public Class TestClass(Of T As {MyBaseClass, INotifyPropertyChanged, New}) Public Interface IGenericInterface(Of T As SomeBaseClass)
是。
public interface IGenericFace<T> where T : BaseClass { }
通用接口的更多信息: http : //msdn.microsoft.com/en-us/library/kwtft8ak(VS.80).aspx