猿教程 Logo

C#泛型约束

在上一节中你已经学会了泛型。 泛型允许你使用占位符定义一个类,它的字段,方法,参数等类型。参考下面的泛型类的例子。

相关实例:

class MyGenericClass<T>
{
    private T genericMemberVariable;

    public MyGenericClass(T value)
    {
        genericMemberVariable = value;
    }

    public T genericMethod(T genericParameter)
    {
        Console.WriteLine("Parameter type: {0}, value: {1}", typeof(T).ToString(),genericParameter);
        Console.WriteLine("Return type: {0}, value: {1}", typeof(T).ToString(), genericMemberVariable);
            
        return genericMemberVariable;
    }

    public T genericProperty { get; set; }
}

在上面的例子中,通用类MyGenericClass为类型定义了一个占位符,但占位符就像一个黑盒子,因为MyGenericClass不知道占位符类型,无论是原始类型还是非原始类型,或接口 或自定义类等。

C#包括约束以指定允许使用通用类的占位符类型类型。 如果您尝试使用约束不允许的占位符类型来实例化通用类,则会产生编译时错误。 例如,如果通用约束指定只有引用类型可以与通用类一起使用,那么您不能使用值类型来创建通用类型的对象。

可以使用where关键字应用约束。 在下面的示例中,MyGenericClass指定了只有引用类型可以与MyGenericClass一起使用的约束。 这意味着只有一个类可以是一个占位符类型,而不是原始类型,struct等。

相关实例:

class MyGenericClass<T> where T: class
    {
        private T genericMemberVariable;

        public MyGenericClass(T value)
        {
            genericMemberVariable = value;
        }

        public T genericMethod(T genericParameter)
        {
            Console.WriteLine("Parameter type: {0}, value: {1}", typeof(T).ToString(),genericParameter);
            Console.WriteLine("Return type: {0}, value: {1}", typeof(T).ToString(), genericMemberVariable);
            
            return genericMemberVariable;
        }

        public T genericProperty { get; set; }
    }

所以现在,你不能使用int作为占位符类型。 以下将给出编译时错误。

相关实例:

MyGenericClass<int> intGenericClass = new MyGenericClass<int>(10);

字符串或任何类类型是有效的类型,因为它是一个引用类型。

相关实例:

MyGenericClass<string> strGenericClass = new MyGenericClass<string>("Hello World");

MyGenericClass<Student> strGenericClass = new MyGenericClass<Student>(new Student());

下表列出了泛型约束的类型。

约束描述
where T : class类型必须是引用类型。
where T: struct类型必须是值类型。
where T: new()类型必须具有public无参构造函数。
where T: <base class name>类型必须是或从指定的基类派生
where T: <interface name>类型必须是或实现指定的接口。
where T: U类型必须或派生自U提供的参数



多重约束

泛型类可以有多个约束,如下所示。

泛型多重约束实例:

class MyGenericClass<T, U> where T: class where U:struct
{
    ...
}

泛型方法的约束

您也可以对泛型方法应用约束。

相关实例:

class MyGenericClass<T> where T: class 
{
    public T genericMethod<U>(T genericParameter, U anotherGenericType) where U: struct
    {
        Console.WriteLine("Generic Parameter of type {0}, value {1}", typeof(T).ToString(),genericParameter);
        Console.WriteLine("Return value of type {0}, value {1}", typeof(T).ToString(), genericMemberVariable);
            
        return genericMemberVariable;
    }        
}

因此,可以在泛型类型上应用约束。

重点
  1. 约束指定了类属性允许的类型。

  2. 可以使用where关键字应用约束。

  3. 可以应用六种类型的约束:class,struct,new(),基类名,接口和派生类型。

  4. 也可以应用多个约束。


版权声明:本站所有教程均为本站原创或翻译,转载请注明出处,请尊重他人劳动果实。请记住本站地址:www.yuanjiaocheng.net (猿教程) 作者:卿文刚
本文标题: C#环境
本文地址:http://www.yuanjiaocheng.net/CSharp/Csharp-Generics-Constraints.html