泛型接口的类型是否可能基于特定的父类?C#泛型能否具有特定的基本类型?
例如:
public interface IGenericFace<T : BaseClass>
{
}
显然上面的代码不工作,但如果没有,我想告诉编译器是T
必须是子类的BaseClass
。这能做到吗,有没有计划等等?
我认为这对于一个特定的项目来说很有用,确保在编译时一个通用的接口/类不会被用于非预期的类型。或者也可以对自我文件进行排序:显示打算使用哪种类型的文件。
泛型接口的类型是否可能基于特定的父类?C#泛型能否具有特定的基本类型?
例如:
public interface IGenericFace<T : BaseClass>
{
}
显然上面的代码不工作,但如果没有,我想告诉编译器是T
必须是子类的BaseClass
。这能做到吗,有没有计划等等?
我认为这对于一个特定的项目来说很有用,确保在编译时一个通用的接口/类不会被用于非预期的类型。或者也可以对自我文件进行排序:显示打算使用哪种类型的文件。
public interface IGenericFace<T> where T : SomeBaseClass
是的。
public interface IGenericFace<T>
where T : BaseClass
{
}
什么你指的是被称为“通用约束”。可以对通用类型施加大量限制。
一些基本的例子如下:
where T: struct
- 类型参数必须是一个值类型。可以指定除Nullable
之外的任何值类型。有关更多信息,请参见Using Nullable Types (C# Programming Guide)。
where T : class
- 类型参数必须是引用类型;这也适用于任何类,接口,委托或数组类型。
where T : new()
- 类型参数必须具有公共无参数构造函数。与其他约束一起使用时,必须最后指定new()
约束。
where T : <base class name>
- 类型参数必须是或从指定的基类派生。
where T : <interface name>
- 类型参数必须是或实现指定的接口。可以指定多个接口约束。约束接口也可以是通用的。
where T : U
- 为T
提供的类型参数必须来自为U
提供的参数。这被称为裸类型约束。
这些也可以连接在一起,就像这样:
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)
您可以在HTTP上找到如何约束类型的详细信息:/ /msdn.microsoft.com/en-us/library/d5x73970(VS.80)。aspx – tvanfosson 2008-10-23 18:01:49
@Kyralessa,是否有可能有一个泛型基类 – Demodave 2015-06-02 20:27:20