代码之家  ›  专栏  ›  技术社区  ›  Neil C. Obremski

C#泛型可以有特定的基类型吗?

  •  39
  • Neil C. Obremski  · 技术社区  · 16 年前

    例如:

    public interface IGenericFace<T : BaseClass>
    {
    }
    

    T 必须是的子类 BaseClass . 这能做到吗?有计划吗。?

    我认为它对于特定的项目很有用,确保在编译时泛型接口/类不会与意外类型一起使用。或者也可以对自我文档进行排序:显示所需的类型。

    4 回复  |  直到 16 年前
        1
  •  89
  •   Ryan Lundy    16 年前
    public interface IGenericFace<T> where T : SomeBaseClass
    
        2
  •  66
  •   TN.    12 年前

    您所指的是“通用约束”。可以对泛型类型施加许多约束。

    一些基本例子如下:

    • 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)
    
        3
  •  6
  •   John Sheehan    16 年前

    public interface IGenericFace<T>
        where T : BaseClass
    {
    }