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