类型参数的约束(C# 编程指南)

转载 2011年01月17日 10:48:00

在定义泛型类时,可以对客户端代码能够在实例化类时用于类型参数的类型种类施加限制。如果客户端代码尝试使用某个约束所不允许的类型来实例化类,则会产生编译时错误。这些限制称为约束。约束是使用 where 上下文关键字指定的。下表列出了六种类型的约束:

约束

说明

T:结构

类型参数必须是值类型。可以指定除 Nullable 以外的任何值类型。有关更多信息,请参见使用可空类型(C# 编程指南)

T:类

类型参数必须是引用类型,包括任何类、接口、委托或数组类型。

Tnew()

类型参数必须具有无参数的公共构造函数。当与其他约束一起使用时,new() 约束必须最后指定。

T<基类名>

类型参数必须是指定的基类或派生自指定的基类。

T<接口名称>

类型参数必须是指定的接口或实现指定的接口。可以指定多个接口约束。约束接口也可以是泛型的。

TU

T 提供的类型参数必须是为 U 提供的参数或派生自为 U 提供的参数。这称为裸类型约束。

 
使用约束的原因

如果要检查泛型列表中的某个项以确定它是否有效,或者将它与其他某个项进行比较,则编译器必须在一定程度上保证它需要调用的运算符或方法将受到客户端代码可能指定的任何类型参数的支持。这种保证是通过对泛型类定义应用一个或多个约束获得的。例如,基类约束告诉编译器:仅此类型的对象或从此类型派生的对象才可用作类型参数。一旦编译器有了这个保证,它就能够允许在泛型类中调用该类型的方法。约束是使用上下文关键字 where 应用的。下面的代码示例演示可通过应用基类约束添加到 GenericList<T> 类(在泛型介绍(C# 编程指南)中)的功能。

 

约束 说明

T:结构

类型参数必须是值类型。可以指定除 Nullable 以外的任何值类型。有关更多信息,请参见使用可空类型(C# 编程指南)

T:类

类型参数必须是引用类型,包括任何类、接口、委托或数组类型。

T:new()

类型参数必须具有无参数的公共构造函数。当与其他约束一起使用时,new() 约束必须最后指定。

T:<基类名>

类型参数必须是指定的基类或派生自指定的基类。

T:<接口名称>

类型参数必须是指定的接口或实现指定的接口。可以指定多个接口约束。约束接口也可以是泛型的。

T:U

为 T 提供的类型参数必须是为 U 提供的参数或派生自为 U 提供的参数。这称为裸类型约束。

public class Employee
{
    private string name;
    private int id;

    public Employee(string s, int i)
    {
        name = s;
        id = i;
    }

    public string Name
    {
        get { return name; }
        set { name = value; }
    }

    public int ID
    {
        get { return id; }
        set { id = value; }
    }
}

public class GenericList<T> where T : Employee
{
    private class Node
    {
        private Node next;
        private T data;

        public Node(T t)
        {
            next = null;
            data = t;
        }

        public Node Next
        {
            get { return next; }
            set { next = value; }
        }

        public T Data
        {
            get { return data; }
            set { data = value; }
        }
    }

    private Node head;

    public GenericList() //constructor
    {
        head = null;
    }

    public void AddHead(T t)
    {
        Node n = new Node(t);
        n.Next = head;
        head = n;
    }

    public IEnumerator<T> GetEnumerator()
    {
        Node current = head;

        while (current != null)
        {
            yield return current.Data;
            current = current.Next;
        }
    }

    public T FindFirstOccurrence(string s)
    {
        Node current = head;
        T t = null;

        while (current != null)
        {
            //The constraint enables access to the Name property.
            if (current.Data.Name == s)
            {
                t = current.Data;
                break;
            }
            else
            {
                current = current.Next;
            }
        }
        return t;
    }
}

相关文章推荐

类型参数的约束(C# 编程指南)

类型参数的约束(C# 编程指南) Visual Studio 2005 其他版本 38(共 55)对本文的评价是有帮助 - 评价此主题 ...

类型参数的约束(C# 编程指南)

类型参数的约束(C# 编程指南) 在定义泛型类时,可以对客户端代码能够在实例化类时用于类型参数的类型种类施加限制。如果客户端代码尝试使用某个约束所不允许的类型来实例化类,则会产生编译...

将数组作为参数传递(C# 编程指南)

数组可作为实参传递给方法形参。 由于数组是引用类型,因此方法可以更改元素的值。 将一维数组作为参数传递 可以将初始化的一维数组传递给方法。 例如,下面的语句将数...
  • adc_god
  • adc_god
  • 2016年01月03日 19:42
  • 181

枚举类型(C# 编程指南)

枚举类型(C# 编程指南) Posted on 2009-03-03 16:35 ottox 阅读(681) 评论(0)编辑收藏枚举类型(C# 编程指南) 更新:2007 年 11 月枚举类型(也称...
  • rise51
  • rise51
  • 2011年02月17日 16:06
  • 320

如何:在十六进制字符串与数值类型之间转换(C# 编程指南)

如何:在十六进制字符串与数值类型之间转换(C# 编程指南) 以下示例演示如何执行下列任务: 获取字符串中每个字符的十六进制值。 获取与十六进制字符串中的每个值对应的字符。 将十六进制...

可以为 null 的类型(C# 编程指南)

可以为 null 的类型是 System.Nullable 结构的实例。 可以为 null 的类型可以表示其基础值类型正常范围内的值,再加上一个 null 值。 例如,Nullable 读作“可以为...

C#编程指南——隐式类型和匿名类型

1.var 关键字 在方法范围中声明的变量可以具有隐式类型 var。

linux shell编程指南第二十章------向脚本传递参数

前面已经讲到如何使用特定变量$ 1 . . $ 9向脚本传递参数。$ #用于统计传递参数的个数。可 以创建一个u s a g e语句,需要时可通知用户怎样以适当的调用参数调用脚本或函数。 简单地说...

数组和指针作为函数参数——高质量C、C++编程指南

本文内容出自《高质量C、C++编程指南》。阅读之后理解,然后通过自己的话和例子讲清楚,这样才是学习之道。以下内容都是自己所认为的东西,如果哪里错了,希望各位大神指出。 1、数组作为函数的参数进行传递时...

Sprite Kit编程指南(6)-使用其他节点类型

高级场景处理 使用Sprite Kit涉及到操纵场景树的内容来让内容在屏幕上的动起来。通常情况下,动作是该系统的核心。然而,通过直接地挂接到(hooking into)场景处理,你可以创建动作不能...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:类型参数的约束(C# 编程指南)
举报原因:
原因补充:

(最多只允许输入30个字)