C#泛型可以有特定的基类型吗?
泛型接口的类型是否可能基于特定的父类 例如:C#泛型可以有特定的基类型吗?,c#,generics,C#,Generics,泛型接口的类型是否可能基于特定的父类 例如: public interface IGenericFace<T : BaseClass> { } IGenericFace公共接口 { } 显然,上面的代码不起作用,但如果它起作用,我想告诉编译器的是t必须是BaseClass的子类。这能做到吗?有计划吗 我认为它对于特定的项目很有用,确保在编译时泛型接口/类不会与意外类型一起使用。或者也可以对自我文档进行排序:显示所需的类型。公共接口IGenericFace其中T:SomeBaseC
public interface IGenericFace<T : BaseClass>
{
}
IGenericFace公共接口
{
}
显然,上面的代码不起作用,但如果它起作用,我想告诉编译器的是t
必须是BaseClass
的子类。这能做到吗?有计划吗
我认为它对于特定的项目很有用,确保在编译时泛型接口/类不会与意外类型一起使用。或者也可以对自我文档进行排序:显示所需的类型。公共接口IGenericFace其中T:SomeBaseClass
public interface IGenericFace<T> where T : SomeBaseClass
是
IGenericFace公共接口
其中T:BaseClass
{
}
您所指的是“通用约束”。可以对泛型类型施加许多约束
一些基本例子如下:
-类型参数必须是值类型。可以指定除其中T:struct
-之外的任何值类型。有关更多信息,请参阅Nullable
-类型参数必须是引用类型;这也适用于任何类、接口、委托或数组类型其中T:class
-类型参数必须具有公共无参数构造函数。当与其他约束一起使用时,必须最后指定其中T:new()
约束new()
-类型参数必须是或派生自指定的基类其中T:
-类型参数必须是或实现指定的接口。可以指定多个接口约束。约束接口也可以是泛型的其中T:
-为其中T:U
提供的类型参数必须是或派生自为T
提供的参数。这称为裸类型约束U
你可以在@Kyralessa上找到更多关于如何约束类型的信息,有没有可能有一个泛型的BaseClass这个应该被删除,我看不出它是如何添加任何东西的-Kyralessa已经回答了这个问题。
public interface IGenericFace<T>
where T : BaseClass
{
}
public class TestClass<T> where T : MyBaseClass, INotifyPropertyChanged, new() { }
public interface IGenericFace<T> where T : SomeBaseClass
Public Class TestClass(Of T As {MyBaseClass, INotifyPropertyChanged, New})
Public Interface IGenericInterface(Of T As SomeBaseClass)